0

オブジェクトが COM オブジェクトである会計システムの統合に取り組んでいます。

次のように 1 対 1 でバインドすると、問題なく動作します。

IKernel kernel = new StandardKernel();
kernel.Bind<IAcoSDKX>().ToMethod(_ => { return new AcoSDKX(); }).InSingletonScope();

私が抱えている状況は、 と の両方IAcoSDKXAcoSDKXインターフェースでありAcoSDKClass、消費者が にアクセスできないということです。

そのため、スペルだけが異なるため、両方のインターフェイスをバインドする方法を探しています。Ont は「I」で始まり、other は始まりません。そこで、バインドされていないインターフェイスを使用し続けていても、コンストラクター インジェクションによってオブジェクトをアクティブ化するときに、Ninject が何にバインドするかを認識している、従来のバインドを思いつきたいと思います。

これが私がこれまでに思いついた試みであり、成功していません。

kernel.Bind(services => services
      .FromAssembliesMatching("AcoSDK.dll")
      .SelectAllTypes()
      .Where(t => t.Name.StartsWith("I") && t.IsInterface)
      .BindDefaultInterfaces());

それで、実際のニーズに合ったNinjectを使用してコンベンションバインディングを構成するにはどうすればよいのでしょうか?

基本的には、"I" で始まるすべてのインターフェイスを、"I" プレフィックスを除いた同じ名前のインターフェイスにバインドするという規則があります。

編集

さらに検索した結果、AcoSDK.dll の型が自分のアセンブリに埋め込まれていることがわかりました。初期ロードされたタイプのみがバインド可能です。

また、COM オブジェクト インターフェイスを新しく作成することはできますが、Activator.CreateInstanceはインターフェイスであるという口実でそれを初期化しません。次のオブジェクト宣言を参照してください。

namespace AcoSDK {
    [ComImport]
    [Guid("00000114-0000-000F-1000-000AC0BA1001"]
    [TypeLibType(4160)]
    public interface IAcoSDKX { }

    [ComImport]
    [Guid("00000114-0000-000F-1000-000AC0BA1001")]
    [CoClass(typeof(AcoSDKClass))]
    public interface AcoSDKX : IAcoSDKX { }

    [ComImport]
    [Guid("00000115-0000-000F-1000-000AC0BA1001")]
    [TypeLibType(2)]
    [ClassInterface(0)]
    public class AcoSDKXClass : IAcoSDKX, AcoSDKX { }
}

public class Program() {
    // This initializes the type.
    IAcoSDKX sdk = new AcoSDKX();  
    
    // This also does.
    IKernel kernel = new StandardKernel();
    kernel.Bind<IAcoSDKX>().ToMethod(_ => new AcoSDKX()); 

    // This won't activate because type is an interface.
    IAcoSDKX sdk = Activator.CreateInstance(typeof(AcoSDKX));  

    //  This says :  Interop type AcoSDKXClass cannot be embedded.  Use the applicable interface instead.    
    IAcoSDKX sdk = Activator.CreateInstance(typeof(AcoSDKXClass));  

    // Same message occurs when newing.
    IAcoSDKX sdk = new AcoSDKClass();  
}

この新しい情報を踏まえて、COM オブジェクトで同様の経験をした人はいますか? 新しい を作成しようとしAcoSDKClassたり、何らかの方法でアクセスしようとしたりしましたが、フックがつかないようです。

4

1 に答える 1