3

所以这里是新手,所以请随时让我知道任何违反礼仪的行为!

我是库编译的新手,一直在研究(主要在这个论坛上)构建可以从办公室和其他支持 vba 脚本的程序引用的库。我找到了一些很好的答案。我已经成功地从这个线程执行了解决方案:

一个简单的 C# DLL - 如何从 Excel、Access、VBA、VB6 调用它?

这涉及在 VBA 中创建 C# 类的实例,然后调用该类的方法(dll 必须是“regasm”)。我对此线程中概述的解决方案非常感兴趣:

以编程方式在 VBA 宏中设置 DLL 搜索路径

其中最受好评的答案(来自 Panda-34)似乎显示了一种使用纯声明函数而不是创建对象的方法。如果我正确理解了 Panda 的回答,这种方法能够将 dll 加载到 vba 项目中,而无需在 tools->references 中设置引用(它使用 ChDir 的巧妙技巧)。

我能够让 DeclareFunction 传递 vba 编译,但是当执行到达使用该函数的行时,我收到“无法确定入口点”类型的消息。此错误的所有论坛解决方案都涉及使用 regasm 在 dll 中注册类,然后设置引用以便可以创建类的实例。我的问题是:

1) 在 Panda 的解决方案中,dll 是否还需要 regasm?

2) 使用 C# 来实现这个解决方案是不可能的,因为 C# 函数总是包装在类中吗?我开始怀疑问题是否在于您不能在 dll 的全局级别不可见的方法上声明函数,因为它可能是模棱两可的 - Test.dll 中的 Class1 和 Class2 可能都有一个 HelloWorld() 成员. 如果是这样的话,无论如何我更喜欢 C++(我的机器有 csc 而不是 cl,所以我一直在学习一些 C#)。

如果我不应该为这个问题开始一个新线程,我很抱歉。我是 SO 的新手,所以我无权评论 Panda 的答案,而且它明确表示不要用你的答案问另一个关于某人的答案的问题,所以我认为这意味着开始一个新线程......

4

1 回答 1

0

C# 不支持 MSIL 的所有功能。全局函数就是其中之一。所以 AFAIK 你不能在 C# 中拥有全局函数,它只是不是语言的一部分。例如,您需要托管 C++。至于我的经验,最好的方法是使用通过 regasm 和代码库开关注册的 COM 友好的 c# 程序集。

于 2012-12-14T08:32:28.613 回答