在 VBA 中加载 C# 程序集(编译为 .dll)

Loading a C# assembly (compiled to a .dll) in VBA

提问人:puredopamine 提问时间:2/27/2023 更新时间:3/1/2023 访问量:148

问:

我有一个调用 C# 的 C++/CLI 的现有代码库,并希望从 VBA 驱动这两个代码库。C# 代码是从 C++/CLI 调用的,如果我使用简单的 C++ exe 运行它,效果很好。问题是,我现在正在尝试从 VBA 调用 C++/CLI(以及后续的 C#)。我的代码成功找到了 C++/CLI .DLL,但无法完成对 C# 的后续调用!检查时,C++/CLI 似乎没有找到 C# .DLL...C++/CLI .dll 和 C# .dll 位于同一文件夹中(不在 excel.exe 文件夹中)。

在VBA代码中,我尝试使用“LoadLibrary”和绝对路径加载dll。它似乎在 VBA 调试器中工作(两个 dll 都返回句柄),但是如果我使用 Visual Studio 进行调试,则我的 C# .dll 似乎没有正确加载。在模块窗口中,我有一条消息说“库未从指定的加载目录加载”或(与此同义词)对于我的 C# .dll。这可能是因为我的 C# .dll 被编译为程序集吗?这种类型的库是否需要不同的加载方法?

请注意,我无法为 COM 互操作注册 C# .dll,也无法将其与 excel.exe 放在同一文件夹中。这里任何需要管理员权限的东西都是完全禁止的。

在VBA代码中,我尝试使用“LoadLibrary”和绝对路径加载dll。它似乎在 VBA 调试器中工作(两个 dll 都返回句柄),但是如果我使用 Visual Studio 进行调试,我的 C# .dll 似乎没有正确加载。在模块窗口中,我有一条消息,说我的 C# .dll 的“库未从指定的加载目录加载”(或与之同义的东西)。这可能是因为我的 C# .dll 被编译为程序集吗?这种类型的库是否需要不同的加载方法?

我还在我的 C++/CLI 层中尝试了 Assembly LoadFile,而不是在项目中使用引用,但这并没有让我有任何收获。

当从与 dll 位于同一文件夹中的 C++ 应用程序 exe 调用时,这一切都可以正常工作。

C# Excel VBA C++-CLI 加载库

评论

0赞 Alex K. 2/27/2023
请注意,您不一定需要管理员权限来执行 COM 注册,例如 stackoverflow.com/questions/35782404/...
0赞 Alex K. 2/27/2023
Fuslogvw.exe 可以帮助诊断绑定问题。

答:

-2赞 puredopamine 3/1/2023 #1

使用 Assembly::LoadFile 和在 C# 中调用方法修复了此问题。