Pregunta

Estoy intentando producir un contenedor de C# para un objeto COM que tengo (llamado SC_COM.dll), pero tengo algunos problemas para vincularlo con Visual Studio 2008 (que ejecuta Vista).Necesito hacer esto sin registro con COM DLL. Estoy usando un archivo de manifiesto para informar a Visual Studio sobre SC_COM.dll y parece estar funcionando.Utilicé TblImp.exe para generar una biblioteca de tipos (SC_COMtlb.dll) a la que hago referencia en Visual Studio 2008 para poder realizar un enlace anticipado con la DLL que necesito.Las DLL están en el mismo directorio que el manifiesto y el ejecutable.

Aquí está el problema:Cuando creo una instancia del 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 admite dicha interfaz (excepción de HRESULT:0x80004002 (E_NOINTERFACE)).

No estoy completamente seguro de lo que significa este error. Hice una búsqueda del código de error y parece ser un error de C# relativamente general.Entonces, ¿voy a vincular el objeto COM de manera incorrecta aquí o hay algún otro paso importante que me pueda faltar?

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 simplemente se ve igual directorio.¿Podría ser este el problema y, de ser así, cómo puedo vincular mejor los dos?

¿Fue útil?

Solución

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}" />

Dónde se puede encontrar TLBID en el Native.Namespace.Assembly.Name.manifest generado por Visual Studio, con este aspecto:

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

Estuve golpeándome la cabeza contra esto durante bastante tiempo, pero encontré estas referencias útiles, las reconstruí y está funcionando para mí:

Otros consejos

el código de error significa que Visual Studio piensa que se supone que un determinado objeto implementa una determinada interfaz, pero cuando intento "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 e interfaz de los metadatos almacenados en la 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 indicó 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 podría tener esta DLL:a veces tienes una clase que implementa una interfaz ISomething2 que se deriva de una interfaz ISomething, pero la implementación de la 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?

¿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 whatever.exe.manifest El archivo será ignorado.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top