0

VBA で使用する必要がある .NET dll の一連のクラスがあります。一部のメンバーが nullable として宣言されているという問題があるため、VBA で使用できるこれらのクラスのラッパーを作成する必要があります。約20のクラスがあるので、自動化するためのツールやテクニックを探しています。アイデアはありますか?

そして、再質問-このラッパーの準備ができたら-次のようなオブジェクトをコピーする簡単な方法はありますか?

For each [class member] of MyClass
    MyNewClass([class member])=MyClass([class member])
next
4

2 に答える 2

3

VBA を使用している場合は、COM 相互運用機能を使用しています。一般に、COM インターフェイスを明示的に定義することをお勧めします。つまり、次の代わりに:

[ComVisible]
public class MyClass
{
    ...
}

あなたが使用する必要があります:

[ComVisible]
public interface IMyClass
{
    ...
}

[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
    ...
}

これを行うと、簡単です。IMyClassインターフェースで null 許容型を回避し、明示的に実装するだけです。たとえば、次のようになります。

[ComVisible]
public interface IMyClass
{
    ...
    public int MyInt {get; }
}

[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
    ...
    public int? MyInt {get; }

    int IMyClass.MyInt
    {
        get { return this.MyInt ?? 0; }
    }
}

ちなみに、このように明示的なインターフェイス実装を使用するもう 1 つの利点は、COM 相互運用クライアントに伝達する前に例外をログに記録し、例外が COM に伝達されるときに失われる有用なスタック トレース情報を取得できることです。例えば

[ComVisible]
public interface IMyClass
{
    ...
    public void MyMethod();
}

[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
    ...
    public void MyMethod()
    {
    }

    void IMyClass.MyMethod()
    {
        try
        {
            this.MyMethod();
        }
        catch(Exception ex)
        {
            ... log exception ex here ...
            throw;
        }
    }
}
于 2012-09-27T07:43:22.767 に答える
0

問題に適合する可能性のあるアプローチは、MicrosoftのT4を使用することです。CS 2010で利用可能で、2012年の方が良いと思います。2010を使用する場合は、有形のT4エディターの無料バージョンを使用してください。

20は多くのクラスのようには聞こえません。おそらくハンドコーディングの方が速いかもしれませんが、T4は、ソースクラスが変更された場合に利益をもたらすAPIを自動生成するアプローチを提供します。

于 2012-09-27T07:31:04.347 に答える