0

登録不要の COM Interop ライブラリを作成する必要があるMSDN リンクを参照

要件の1つは、引用します

「.NET ベースのクラスが COM からのレジストリを使用しないアクティベーションと互換性を持つには、クラスに既定のコンストラクターがあり、パブリックである必要があります。」

私がそれを読んだとき、私は次のものを作成する必要があります...(これは技術的に機能し、COM経由でこれをインスタンス化するのに問題はありません)

[ComVisible(true)]
[Guid("...")]
public interface ITest
{
    X();
    Y();
}

[ComVisible(true)]
[Guid("...")]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class Test : ITest
{
    private string x;

    public Test() // default constructor
    {
    }

    X()
    {
        // do something with "x" BUT "x" MUST be initialized before this method is called
    }

    Y()
    {
        // do something else with "x" BUT "x" MUST be initialized before this method is called
    }
}

メソッドが呼び出される前に (インターフェイスを介して) このクラスが確実に初期化されるようにする最善の方法を探しています。私が知る限り、パラメーターを使用してコンストラクターをオーバーロードすることはオプションではありません-通常、このクラスをパラメーターを取ったコンストラクターで初期化しますが、Registration Free COM では、そのオプションがありません (または私は?? )。

私の代替手段は、次のような「初期化」機能だと思います...

public interface ITest
{
    Initialize(string x);
    X();
    Y();
}

public class Test : ITest
{
    private string x;
    private bool Initialized;

    public Test() // default constructor
    {
        Initialized = false;
    }

    Initialize(string x)
    {
        this.x = x;
        Initialized = true;
    }

    X()
    {
        if (Initialized)
        {
            // do something with x
        }
        else
        {
            throw...
        }
    }

    Y()
    {
        if (Initialized)
        {
            // do something else with x
        }
        else
        {
            throw...
        }
    }
}

これは面倒だと思いますが、実行可能です...しかし、私が見逃しているより良いオプションは何ですか?

4

2 に答える 2