在wpf项目中使用VBA项目作为dll

时间:2014-06-03 06:57:01

标签: c# wpf excel-vba dllexport vba

我有一个vba项目我希望在c#wpf中做同样的事情,那么有什么方法可以使用相同的项目并使用wpf创建UI?有没有办法像创建这个vba项目的DLL并将其添加到新的wpf项目中并调用现有项目的API。

1 个答案:

答案 0 :(得分:2)

不完全是。 VBA是VB6的残缺版本,因此您没有完整的类型库发布功能。也就是说,让VBA实现typelib发布的COM接口,然后将它们暴露给托管代码并通过COM interop从你喜欢的任何C#代码调用它们(包括WPF),这是可能(虽然相当痛苦) 。

基本上,您需要:

  • 定义IDispatch或双界面
  • 将其发布到类型库中
  • 将类型库引用到您的VBA项目(以及您的C#项目,如果它不是源自那里)
  • 编写实现新接口的VBA类模块
  • 将类的实例化属性设置为PublicNotCreatable
  • 在VBA(非类)模块中编写一个shim函数,您可以通过Excel的Application.Run方法从C#调用该函数 - 该函数应该创建一个VBA类的实例并将其返回。调用C#代码将返回的值强制转换为您之前声明的IDispatch或双接口的托管版本。

Voila-现在您可以直接从C#调用您的VBA代码。它是在几年前,但我已经用巨大的传统VBA代码库完成了这项工作并取得了巨大的成功。然而,这是一个非常痛苦的过程,充满了危险。泄漏接口很容易,COM接口和类型库版本控制存在许多问题,并且线程问题比比皆是。

所有这一切,如果你不知道如何做大部分这些事情,或者无法快速找到你需要的资源,你可能应该考虑将VBA移植到C#。

祝你好运!