Excel 2010 VSE 2012 C#dll和tlb – 无法创build对指定文件的引用

我感兴趣的是如何从Excel中调用C#代码,并一直遵循这里的方法https://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to -calling-a-net-library-from-excel / 。

C#代码是一个名为DotNetClass.cs的“Hello World”示例

using System; using System.Collections.Generic; using System.Text; namespace DotNetLibrary { public class DotNetClass { public string DotNetMethod(string input) { return "Hello " + input; } } } 

构buildconfiguration有“注册COM互操作”和“Make assembly COM-visible”选项。 我也有select“.NET Framework 4.5”和“任何CPU”(我在一台64位机器上工作)。 我已经尝试了几个NET版本和CPU选项没有成功。 我清理并重build了好几次。

在Excel 2010中,我无法创build对DotNetLibrary.dll的引用。 我可以浏览它,我甚至可以在同一个地方创build一个文件的引用 – DotNetLibrary.tlb。

来自Excel的电话是

 Private Sub TestDotNetCall() Dim testClass As New DotNetClass MsgBox testClass.DotNetMethod(“World”) End Sub 

…这个工程 – 几乎。 如果我运行VBA代码(F5),我会得到一个MsgBox(woot!),并显示消息“Hello”(no“World” – unwoot!)。 所以,这似乎忽略了这个论点(“世界”),这个论点似乎是无法达到这个目的的。

我会很感激任何解释。 引用tlb文件是一件好事吗? 为什么我似乎不能通过参数,或从dll / tlb得到结果? 有一个更好的方法吗?

我得到它的工作。 出现这个问题的原因是C#是强types的,VBA是松散types的。

在VBA线

 MsgBox testClass.DotNetMethod(“World”) 

一个“事物”(技术上来说是一个var ,我相信)值“World”传递给DotNetMethod。 问题是DotNetMethod不知道什么types的“世界”是“事物”,所以它忽略了它。

解决办法是在VBA中明确定义“World”的types,如下所示

 Private Sub TestDotNetCall() Dim testClass As New DotNetClass Dim s As String s = "World" MsgBox (testClass.DotNetMethod(s)) End Sub 

…所以,“你好世界”