如何加载在GAC中注册的混合程序集?

时间:2012-11-13 14:57:44

标签: .net interop .net-assembly

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

我在互操作项目中遇到装配加载问题

即。有3个VS项目:

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

  • B是一个CLI包装器,它依次静态引用C对象;

  • C是CS项目,纯粹是.NET代码。

B和C都使用强名称进行签名,其 AssemblyInfo.cs AssemblyInfo.cpp 文件将使用其密钥文件进行更新。

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

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

  

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

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

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

1 个答案:

答案 0 :(得分:0)

您正在使用一些黑客来加载CLR来执行托管代码。据推测,您在CLI代码中编写了静态函数,并使用__declspec(dllexport)对其进行了修饰。是的,这是有效的,本机代码(A)可以通过C ++ / CLI编译器生成的存根调用,以确保加载和初始化CLR。

然而无法工作的是CLR帮助在GAC中找到DLL。这是一个鸡与蛋的问题,CLR必须先加载才能找到装配体。所以B找C是没问题的。但是发现B不会起作用。本机Windows加载程序的工作是找到B,它根本没有理由查看GAC。

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