提问人:puredopamine 提问时间:2/27/2023 更新时间:3/1/2023 访问量:148
在 VBA 中加载 C# 程序集(编译为 .dll)
Loading a C# assembly (compiled to a .dll) in VBA
问:
我有一个调用 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 调用时,这一切都可以正常工作。
答:
使用 Assembly::LoadFile 和在 C# 中调用方法修复了此问题。
评论