0

我在 .NET dll 中有一组类,我需要在 VBA 中使用它们。一些成员被声明为可为空的问题,所以我必须为这些类制作一个包装器,我可以在 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接口中避免可以为空的类型,并显式地实现它,例如:

[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 互操作客户端之前记录异常,并获取有用的堆栈跟踪信息,这些信息在异常传播到 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 回答