Оболочка.NET в VBA

У меня есть набор классов в.NET DLL, который мне нужно использовать в VBA. Проблема в том, что некоторые члены объявляются как обнуляемые, поэтому мне нужно сделать обертку для этих классов, которую я могу использовать в VBA. Есть около 20 классов, поэтому я ищу какой-нибудь инструмент или технику, чтобы сделать это автоматически, какие-нибудь идеи?

И повторяющийся вопрос - когда у меня есть готовая оболочка - есть ли какой-нибудь простой способ скопировать объекты, такие как:

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

2 ответа

Если вы используете 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 COMop и получать полезную информацию трассировки стека, которая теряется при распространении исключений в 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;
        }
    }
}

Подход, который может решить проблему, заключается в использовании Microsoft T4. Доступно в CS 2010, и я считаю, что лучше в 2012 году. Если вы используете 2010, используйте бесплатную версию T4 Editor.

20 не звучит как много классов. Возможно, ручное кодирование может быть быстрее, но T4 предлагает подход к автоматической генерации вашего API, который принесет дивиденды в случае изменения исходных классов.

Другие вопросы по тегам