.NET到VBA包装器

时间:2012-09-27 07:00:23

标签: .net vba interop

我在.NET dll中有一组类,我需要在VBA中使用它们。一些memebers被声明为可空的问题,所以我必须为这些类创建一个包装器,我可以在VBA中使用它。大约有20个课程,所以我正在寻找一些工具或技术来使它自动化,任何想法?

并且重新提出问题 - 当我准备好这个包装器时 - 有一些简单的方法可以复制像这样的对象:

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

2 个答案:

答案 0 :(得分: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时丢失的有用堆栈跟踪信息。 E.g。

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

答案 1 :(得分:0)

可能适合该问题的方法是使用Microsoft的T4。在CS 2010中可用,我相信在2012年会更好。如果使用2010,请使用免费版的有形T4编辑器。

20听起来不像很多课。也许手动编码可能更快,但是T4提供了一种自动生成API的方法,如果源类发生变化,它将带来红利。