Estoy teniendo algunos problemas con la interoperabilidad COM, la situación es la siguiente:uso de 32 bits de servidor COM desde un programa de 64 bits .NET
COM de 32 bits servidor EXE (que fue programado en C++) ofrece una clase con algunas funciones de miembros que se ocupan de hardware de terceros (este hardware también vincula el servidor EXE de COM a 32 bits, ya que el fabricante no es compatible con 64 bits).
Quiero usar el servidor COM Exe de 32 bits en una aplicación .NET (C#) de 64 bits ... Al principio traté de agregar una referencia al servidor Exe en Visual Studio 2010 y creé una interoperabilidad. -DLL. Esta interoperabilidad DLL-me proporcionó las funciones necesarias, estando uno de ellos declarados como:
int Initialize(ref string callingApplicationPath);
La primera declaración en C++ es el siguiente:
LONG Class::Initialize(BSTR* callingApplicationPath)
... y así en IDL:
[id(1)] LONG Initialize([in] BSTR* callingApplicationPath);
Sin embargo, cuando quiero llamar a esta función desde C# a través de la interoperabilidad-DLL, que arroja un BadImageFormatException. Parece que la DLL de Interoperación es una DLL de 32 bits (¿Tal vez hay una posibilidad de generar una DLL de 64 bits?).
Mi siguiente intento fue crear una instancia del servidor EXE con este código:
Type type = Type.GetTypeFromProgID("OurCompany.Class");
Object o = Activator.CreateInstance(type);
Object[] args = { Marshal.StringToBSTR(str) };
Object result = type.InvokeMember("Initialize", BindingFlags.InvokeMethod, null, o, args);
Este código, por otro lado, lanza un TargetInvocationException (Más específicamente: 0x80020005 (DISP_E_TYPEMISMATCH)) a la cabeza. Desafortunadamente, no pude averiguar qué tipo tengo que pasar a la función desde C# ... Probé todas las funciones de StringToXXX en la clase Marshal, pero nada parece funcionar:/Supongo que me está perdiendo algo simple aquí , pero no veo qué.
¡Cualquier ayuda es muy apreciada!
Saludos
Cristiano
¿Ha intentado iniciar Process Monitor y observar qué ocurre cuando se realiza la creación de instancias? Tal vez no encuentre algunas entradas de registro, o algún proceso tiene derechos insuficientes? Process Monitor migt ayuda con eso. – sharptooth
@sharptooth: la instanciación en sí funciona bien y puedo invocar con éxito un método ficticio que no toma argumentos y devuelve un int. El problema es "solo" el System.String -> BSTR * conversion – Christian
Veo. ¿De qué sirve pasar BSTR * como un parámetro "in"? ¿Por qué no solo BSTR? – sharptooth