编译一个支持VBA中声明函数的DLL

时间:2012-12-14 04:27:25

标签: c# c++ .net vba dll

如此新闻,请随时告诉我任何违反礼节的行为!

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

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

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

Programmatically set DLL search path in VBA macro

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

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

1)在Panda的解决方案中,dll仍需要regasm吗?

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

如果我不应该为这个问题开始一个新主题,我很抱歉。我是SO的新手,所以我没有权限评论Panda的答案,并且它特别说不要在你的答案中提出有关某人答案的另一个问题,所以我认为这意味着开始一个新的话题...... / p>

1 个答案:

答案 0 :(得分:0)

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