私の制御不能な会社の制約により、次のシナリオがあります。
次のインターフェイスを定義する 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++ で記述) があります。すべてうまくいっていると思います。
私は.NET(C#)で 新しいものを構築しようIProvider
としています。IService
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 でメソッドを呼び出そうとすると、aSystem.ExecutionEngineException
がスローされます。
私が見つけることができる唯一の他のことは、#import によって作成された .tlh ファイルを見ることです。レガシー COM IExistingProvider クラスが、それが IServiceProvider から派生したことを正しく示していることを示しています。ただし、.NET クラスは IDispatch のベースを示しています。これが兆候なのか、兆候なのか、役に立つのか、それとも何か他のものなのか、私にはわかりません。