Debido a las limitaciones de la compañía fuera de mi control, tengo el siguiente escenario:Derivación de interfaces COM en .NET
bibliotecaCOM que define la interfaz siguiente (sin Coclase, sólo la interfaz):
[
object,
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
dual,
nonextensible,
helpstring("IService Interface"),
pointer_default(unique)
]
IService : IDispatch
{
HRESULT DoSomething();
}
[
object,
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
dual,
nonextensible,
helpstring("IProvider Interface"),
pointer_default(unique)
]
IServiceProvider : IDispatch
{
HRESULT Init(IDispatch *sink, VARIANT_BOOL * result);
HRESULT GetService(LONG serviceIndicator, IService ** result);
};
[
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
version(1.0),
]
library ServiceLibrary
{
importlib("stdole2.tlb");
interface IService;
interface IServiceProvider;
};
Tengo un COM (escrito con C++) que implementa ambas interfaces y proporciona nuestra aplicación (s) con dicho servicio. Todo está bien, creo.
Estoy tratando de construir un nuevo IProvider
y IService
en .NET (C#).
he construido un ensamblado de interoperabilidad primario para la biblioteca COM, e implementó el siguiente C#:
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public interface INewService : IService
{
// adds a couple new properties
}
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public class NewService : INewService
{
// implement interface
}
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public interface INewProvider : IServiceProvider
{
// adds nothing, just implements
}
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public class NewProvider : INewProvider
{
// implement interface
}
Cuando intento deslizarse esto en el tiempo de ejecución existente, soy capaz de crear el objeto NewProvider
de COM (C++) y QueryInterface
para IServiceProvider. Cuando intento llamar a un método en IServiceProvider, se lanza un System.ExecutionEngineException
.
La única otra cosa que puedo encontrar, es mirando los archivos .tlh creados por #import, muestra que la clase heredada COM IExistingProvider muestra correctamente que se deriva de IServiceProvider. Sin embargo, la clase .NET muestra una base de IDispatch. No estoy seguro de si esto es un signo, una indicación, útil, algo más.
Cuando dice que ha "construido" un ensamblado de interoperabilidad primario, quiere usted decir desde cero ? ¿No fue posible simplemente agregar la biblioteca COM como referencia? – ilitirit
Creé el PIA desde TLBIMP.exe. ¿Le gustaría ver una línea de comando de ejemplo para ello? Utilicé TLBIMP, creando mi propio Interop.Services.dll, y luego hice referencia a eso. Recientemente adquirí ".NET y COM - La Guía completa de interoperabilidad". – DevSolo
¿Hay alguna razón por la que no importó la biblioteca directamente en Visual Studio? ¿O no está utilizando Visual Studio? – ilitirit