3

我在 MSDN 上发布了这个问题,但是通过与 MS 支持沟通有点浪费时间,他们每天只给你一句话,没有任何线索:(,无论如何这是我的问题,感谢任何评论。

我在互操作项目中遇到程序集加载问题

即有3个VS项目:

  • A 是一个本地 C 项目,通过静态绑定引用 B,即 A 调用 B 的函数,如果你愿意;

  • B 是一个 CLI 包装器,它反过来静态引用 C 的对象;

  • C 是一个纯 .NET 代码的 CS 项目。

B 和 C 都使用强名称进行签名,并且它们的AssemblyInfo.csAssemblyInfo.cpp文件使用它们的密钥文件进行更新。

B 和 C 都使用gacutil.exe V4.0在 GAC 中注册。A 在注册 B.dll 的文件夹中引用了 B.dll,B 在注册 C 的同一个文件夹中引用了 C。

当我从 A 运行程序时,它失败并显示消息:

'程序无法启动,因为您的计算机中缺少 B.dll。尝试重新安装 > 程序来解决这个问题'。

我可以使它工作的唯一方法是将 B.dll 复制到 A.exe 的同一文件夹中。似乎 C.dll 是从 GAC 加载的。

混合装配在加载透视图中是否以不同的方式工作?

4

1 回答 1

0

您正在使用一些技巧来加载 CLR 以执行托管代码。大概您在 CLI 代码中编写了静态函数并用__declspec(dllexport). 是的,这行得通,本机代码 (A) 可以通过 C++/CLI 编译器生成的存根调用,以确保加载和初始化 CLR。

然而不能工作的是 CLR 帮助在 GAC 中找到 DLL。这是一个先有鸡还是先有蛋的问题,必须先加载 CLR,然后才能找到程序集。所以B找到C是没有问题的。但是 A 发现 B 是行不通的。查找 B 是本机 Windows 加载程序的工作,根本没有理由查看 GAC。

您需要将 B 部署在与本机程序相同的文件夹中。

于 2012-11-13T18:16:41.490 回答