c# com rcw

Error de la interfaz del contenedor C#: E_NOINTERFACE



com rcw (3)

¿Qué versión de Windows? Desde Windows Vista, un manifiesto interno anula un manifiesto externo. De forma predeterminada, los ejecutables de C # tienen manifiestos internos, lo que significa que su archivo whatever.exe.manifest será ignorado.

Si va a la página de propiedades para su C # EXE, verá que hay una sección de "Icono y manifiesto" en la "pestaña Aplicación". Establezca "Manifiesto" al nombre de su archivo de manifiesto y se incrustará en lugar del predeterminado.

Si eso no funciona, es posible que tenga que realizar algunos pasos posteriores a la construcción con MT.EXE para fusionar su manifiesto externo con el interno predeterminado y para volver a colocar el manifiesto fusionado en el archivo .EXE.

Estoy tratando de producir un contenedor C # para un objeto COM que tengo (llamado SC_COM.dll), pero tengo algunos problemas que lo vinculan con Visual Studio 2008 (ejecutando Vista). Necesito hacer esto sin registro con la DLL COM. Estoy usando un archivo de manifiesto para informar a Visual Studio sobre SC_COM.dll, y eso parece estar funcionando. Usé TblImp.exe para generar una biblioteca de tipos (SC_COMtlb.dll) a la que me refiero en Visual Studio 2008, por lo que puedo enlazar pronto con la DLL que necesito. Los archivos DLL están en el mismo directorio que el manifiesto y el ejecutable.

Este es el problema: cuando instancia el objeto e intento llamar a uno de sus métodos en C #, arroja el siguiente error:

Error detectado: no se puede convertir el objeto COM del tipo ''SC_COMtlb.SCAccessObjClass'' al tipo de interfaz ''SC_COMtlb.ISCUploader''. Esta operación falló porque la llamada QueryInterface en el componente COM para la interfaz con IID ''{C677308A-AC0F-427D-889A-47E5DC990138}'' falló debido al siguiente error: No se admitió dicha interfaz (Excepción de HRESULT: 0x80004002 (E_NOINTERFACE)) .

No estoy del todo seguro de lo que significa este error: he realizado una búsqueda en el código de error, y parece ser un error relativamente general de C #. Entonces, ¿voy a vincular el objeto COM de la manera incorrecta aquí, o hay algún otro paso importante que me puede estar perdiendo?

Probablemente debería tener en cuenta que no estoy del todo seguro de cómo la biblioteca de tipos (S / C_COMtlb.dll) que produje sabe dónde está la DLL COM real, ya que no está registrada en el sistema, supongo que solo se ve en el mismo directorio. ¿Este podría ser el problema? Si es así, ¿cómo puedo vincular mejor los dos?


el código de error significa que Visual Studio piensa que se supone que un determinado objeto implementa una determinada interfaz, pero cuando trato de "conectarme" a esa interfaz el objeto responde que no lo sabe.

Supongo que el problema está en SC_COM.dll. TLBIMP.EXE extrae información de clase y de interfaz de los metadatos almacenados en el archivo DLL y crea contenedores para la clase.

Por ejemplo, si SC_COM está escrito en C ++, esto podría suceder si el creador de la DLL indica en el archivo IDL que una clase implementa esa interfaz, pero el código real no admite esa interfaz.

Aquí hay otra fuente común de problemas que puede tener este DLL: a veces tienes una clase implementando una interfaz ISomething2 que se deriva de una interfaz ISomething, pero la implementación de clase solo reconoce ISomething2. Si implementa una interfaz derivada, también debe reconocer su interfaz base. Este es un error común.

¿Tiene (y controla) el código fuente de la DLL?


Intente agregar esto a su App.exe.manifest:

<comInterfaceExternalProxyStub name="ISCUploader" iid="{C677308A-AC0F-427D-889A-47E5DC990138}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid = "{PUT-YOUR-TLB-GUID-HERE}" />

Donde se puede encontrar TLBID desde su Visual Studio generado Native.Namespace.Assembly.Name.manifest, con el siguiente aspecto:

<typelib tlbid="{A-GUID-IS-HERE--USE-IT}" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />

Me estaba golpeando la cabeza contra esto por bastante tiempo, pero encontré estas útiles referencias y las armé juntas y me funcionan: