【问题标题】:Excel 2010 VSE 2012 C# dll and tlb - Can't create reference to specified fileExcel 2010 VSE 2012 C# dll 和 tlb - 无法创建对指定文件的引用
【发布时间】:2013-10-04 01:07:17
【问题描述】:

我有兴趣找到如何从 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;
        }
    }
}

构建配置已选中“注册 COM 互操作”和“使程序集 COM 可见”。我还有“.NET Framework 4.5”和“Any 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”的 MsgBox(woot!)(没有“World” - unwoot!)。所以,它似乎忽略了论点(“世界”),这似乎违背了这样做的目的。

我会很感激任何解释。引用 tlb 文件是件好事吗?为什么我似乎无法将参数传递给 dll/tlb 或从 dll/tlb 获取结果?有没有更好的方法来做到这一点?

【问题讨论】:

  • .dll 是您的托管程序集,CLR 运行它; .tlb 是您为 COM 互操作注册的类型库 - 您正在做正确的事情。它似乎。对我来说。
  • 你能解释一下你为什么要这样做吗?我问只是因为有 C# 库来操作 Excel 文件。
  • @aspiring.algorist 学习如何通过 COM 公开托管代码从来没有杀死任何人,我的意思是它显然是“hello world”实验代码...... 为什么他这样做是与这里的问题无关:)
  • @retailcoder:我从来没有说过学习这样的东西会产生如此卑鄙的后果 :) 正如我在评论中所说,如果目标是使用 C# 解析 Excel 文件,还有其他方法来实现这一点。除了为问题提供更多上下文之外,也不知道是有害的。
  • 我这样做的原因是想知道如何去做,以及它可能有多么困难。我的想法是为各种定制的技术/数学问题开发 C# 代码,然后从 Excel 作为一种 UI 访问它们。 (当然,我可以通过其他方式访问它们,但由于各种原因,我目前正在研究 Excel。)

标签: c# .net excel vba typelib


【解决方案1】:

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

在 VBA 行中

MsgBox testClass.DotNetMethod(“World”)

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

解决办法是在VBA中显式定义“世界”的类型,如下

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

...所以,“Hello World”

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多