c# - 在VBA中编译支持声明函数的dll

标签 c# c++ .net vba dll

这里是新手,如有任何违反礼节的行为,请随时告诉我!

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

A Simple C# DLL - how do I call it from Excel, Access, VBA, VB6?

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

Programmatically set DLL search path in VBA macro

其中最高赞的答案(来自 Panda-34)似乎展示了一种使用纯 Declare Function 而不是对象创建的方法。如果我正确理解 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 的回答发表评论,而且它明确表示不要用你的回答问另一个关于某人的回答的问题,所以我认为这意味着开始一个新线程......

最佳答案

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

关于c# - 在VBA中编译支持声明函数的dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13872652/

相关文章:

java - 我应该如何在 jna 中按值从 Java 传递和返回 unsigned int 到 C/C++

c# - VS2010 中的 MSBuild 警告消息

c# - C#中如何计算异步方法的执行时间

c# - HTMLWorker 解析器的“对象引用未设置为对象的实例”

c# - 如何以编程方式关闭 IE 保护模式?

c# - MIDI 入门

c# - LINQ to Entities 无法识别方法 IsUserInCc

c# - 将 MongoDB Json 转换为 C# 类

c++ - 可以取地址的变量是左值,这是真的吗?

c++ - 如何通过 std::shared_ptr 访问实例成员变量?