2012-09-27 31 views
0

我有一套.NET .NET dll中的類,我需要在VBA中使用這些類。一些成員被聲明爲可空的問題,所以我必須爲這些類創建一個包裝,我可以在VBA中使用這些包。有大約20個課程,所以我正在尋找一些工具或技術來使其自動化,有什麼想法?.NET到VBA封裝器

而且reatted的問題 - 當我有這個包裝準備 - 有一些簡單的方法來複制對象,如:

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

回答

0

可能適合的問題是使用微軟的T4的一種方法。在CS 2010中可用,我相信在2012年會更好。如果使用2010,則使用免費版的有形T4編輯器。

20聽起來不像很多類。也許手寫代碼可能會更快,但是T4提供了一種自動生成API的方法,如果源類發生變化,它將會帶來收益。

+0

謝謝,你沒錯,T4對20個班級來說太多了:) –

3

如果您使用VBA,則使用COM Interop。一般來說它被認爲是很好的做法,明確定義了COM接口,即代替:

[ComVisible] 
public class MyClass 
{ 
    ... 
} 

你應該使用:

[ComVisible] 
public interface IMyClass 
{ 
    ... 
} 

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

一旦你做到這一點,很簡單:你只需要避免可空類型在IMyClass接口,並明確實現它,如:

[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; } 
    } 
} 

順便以這種方式使用顯式接口實現的另一個好處是,您可以在傳播到COM Interop客戶端之前記錄異常,並獲取當異常傳播到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; 
     } 
    } 
} 
+0

感謝喬,會試試看! –