gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:34:21 25 4
gpt4 key购买 nike

我对查找如何从 Excel 调用 C# 代码很感兴趣,并且一直在关注这里的方法 https://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/ .

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

using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetLibrary
{
public class DotNetClass
{
public string DotNetMethod(string input)
{
return "Hello " + input;
}
}
}

构建配置选中了“Register for COM interop”和“Make assembly COM-visible”。我还有选项“.NET Framework 4.5”和“任何 CPU”(我在 64 位机器上工作)。我尝试了几个 NET 版本和 CPU 选项但没有成功。我已经清理并重建了几次。

在 Excel 2010 中,我无法创建对 DotNetLibrary.dll 的引用。我可以浏览到它,甚至可以在同一位置创建对文件的引用 - DotNetLibrary.tlb。

来自Excel的调用是

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

... 这几乎行得通。如果我运行 VBA 代码 (F5),我会得到一个带有消息“Hello”(没有“World”- unwoot!)的 MsgBox(哇!)。所以,它似乎忽略了参数(“世界”),这似乎违背了这样做的目的。

如有任何解释,我将不胜感激。引用tlb文件是好事吗?为什么我似乎无法将参数传递给 dll/tlb 或从中获取结果?有更好的方法吗?

最佳答案

我让它工作了。出现问题是因为 C# 是强类型的,而 VBA 是松散类型的。

在 VBA 行中

MsgBox testClass.DotNetMethod(“World”)

一个值为“World”的“东西”(我相信技术上是 var)被传递给 DotNetMethod。问题是 DotNetMethod 不知道“世界”是什么类型的“事物”,因此它会忽略它。

解决方法是在VBA中显式定义“World”的类型,如下

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

...因此,“Hello World”

关于c# - Excel 2010 VSE 2012 C# dll 和 tlb - 无法创建对指定文件的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19171555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com