Из-за ограничений компании вне моего контроля, у меня есть следующий сценарий:
Библиотека COM, которая определяет следующий интерфейс (без CoClass, только интерфейс):
[
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;
};
У меня есть COM (написанный на языке C / C), который реализует оба интерфейса и предоставляет нашим приложениям указанную услугу. Все в порядке, я думаю.
Я пытаюсь создать новые IProvider
и IService
в .NET (C #).
Я собрал основную сборку взаимодействия для библиотеки COM и реализовал следующий 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
}
Когда я пытаюсь вставить это в существующую среду выполнения, я могу создать объект NewProvider
из COM (C ++) и QueryInterface
для IServiceProvider. Когда я пытаюсь вызвать метод на IServiceProvider, System.ExecutionEngineException
выбрасывается.
Единственное, что я могу найти, это просмотр файлов .tlh, созданных #import, показывает, что устаревший класс COM IExistingProvider правильно показывает, что он является производным от IServiceProvider. Однако класс .NET показывает базу IDispatch. Я не уверен, что это знак, указание, полезно, что-то еще.