使用标准的.Net库与VBA

7

我已经成功地通过按照这里发布的步骤Execute .NET 3.0 code from Office 2003运行了自己的.Net代码。

有没有一种方法可以使用标准的.Net库而不必编写包装器?这样我们就可以避免在客户机上注册和安装自定义DLL到GAC中。

我已经在C:\Windows\Microsof.NET\Framework文件夹中找到了tlb文件,并且已经能够添加对mscorlib.dll的引用。查看RijndaelManaged的文档,这个类似乎是COM可见的。

我能够创建一个实例,但是一旦我尝试使用它,我就会遇到错误(例如“类型不匹配”)。

Sub Macro1()
   Dim aesImplementation As New RijndaelManaged

   Set key = aesImplementation.GenerateKey()
   Set iv = aesImplementation.GenerateIV()
End Sub

我愿意接受您提供的任何技巧!


2
我对于不使用包装器(wrapper)来使用.NET没有答案,但是如果你是VBA的新手,你需要知道声明某个东西为"As New"并不像在.NET中那样在那一点上实例化任何东西。我不清楚你的错误是在实例化还是在"Set"时引发的。(我假设你已经将你的"key"变量声明为正确的类型等等。)请参阅https://dev59.com/SnE95IYBdhLWcg3wDpmg#2480559 - jtolle
这太疯狂了,如果“As New”语法不实例化新对象,为什么它是有效的语法?虽然在这种情况下似乎确实创建了一个实例,但我至少会记住“As New”不是最佳实践。我没有明确声明关键对象的原因是如果我这样做,就会出现“无法分配给数组”的错误。显然,当您尝试分配给不同类型的数组时,会发生此错误。 - Evil Pigeon
1
这么做是不是有点大费周折呢?我的意思是,如果你的用户允许你运行宏,为什么不运行一个实际的.NET应用程序呢?.NET中的Office互操作性似乎非常好,因此您可以同样或更好地操作文档! - Camilo Martin
6
Dim ... As New 会创建一个新的对象,只是在引用它的地方进行创建,而不是在声明它的地方。这是一个微妙的区别,在这个特定的代码示例中完全无关紧要。 - Christian Hayter
1
就数组的赋值而言,在VBA中您不需要使用“Set”,只需普通的赋值即可。但我不知道将VBA变量分配给.NET字节数组是否有效。 - jtolle
2个回答

1

目前还不可能。VBA(VB for Applications)并非VB,而是一种单独的交易,模仿了旧版本VB的所有基本语法。它几乎就像使用一个非常简化的常规、旧版VB。实际上,VBScript是与VBA最接近的匹配项。也许有一天,微软会内置直接与GAC(全局程序集缓存)一起工作的方法,但在那之前(那一天很可能意味着COM的死亡),您只能使用COM CreateObject() 方法,在Office项目中添加对COM注册库的引用,或在Office项目中直接引用VBA/COM兼容的DLL或TLB文件。

默认的GAC中有相当多的COM启用库,但对于大多数库,您需要先在VB.Net或C#中创建可调用的Com包装器。

相反,几乎所有的MS Office应用程序都是COM可调用的,因此您可以通过VB.Net项目随心所欲地使用已安装的Office应用程序。


3
通过添加对 mscorlib.dll 的引用,您可以在标准 .NET 库中创建任何具有无参公共构造函数的类的对象。您会发现这非常有限制性。 - AndASM
5
"VBScript是最接近VBA的语言" - VBA与经典VB6相比,要比与VBScript更为接近:https://msdn.microsoft.com/en-us/library/ms970436.aspx - Joe

1
你应该能够以这种方式使用ComVisible .NET类。但是GenerateKeyGenerateIV方法没有返回值。尝试:
Sub Macro1()
   Dim aesImplementation As New RijndaelManaged

   aesImplementation.GenerateKey
   Key = aesImplementation.Key
   aesImplementation.GenerateIV
   IV = aesImplementation.IV
End Sub

更好的是,这样做不仅可以让你在调试时看到错误是在构建过程中还是在调用方法时发生的。
Sub Macro1()
   Dim aesImplementation As RijndaelManaged
   Set aesImplementation = New RijndaelManaged

   aesImplementation.GenerateKey
   Key = aesImplementation.Key
   aesImplementation.GenerateIV
   IV = aesImplementation.IV
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接