Оболочка.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, который принесет дивиденды в случае изменения исходных классов.