我的项目A引用项目B.项目B包含对第三方程序集的引用。项目A位于项目B和第三方程序集之外的另一个文件夹中(由于与其他软件集成)。我知道我可以在集成文件夹中安装程序集,但我希望将它们放在我自己的文件夹中,其中包含所有其他程序集以及用于诊断和设置模块的可执行文件。
我已在MyResolveEventHandler
中订阅了项目A中的AppDomain.CurrentDomain
,并且可以成功设置项目B的正确装配路径。当项目A调用项目B中的方法时,会发生问题使用派对组装。然后它为该程序集抛出FileNotFoundException
,它显示集成文件夹的路径,而不是我在MyResolveEventHandler
中为项目B设置的文件夹。
我已经尝试了AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(@"pathOf3rdPartyAssembly"))
,它会告诉我它已成功加载Appdomain
中的程序集,但仍然会抛出上面提到的FileNotFoundException
。
如何从项目A中设置项目B中使用的第三方装配的装配路径?
修改 抱歉,这个问题是由我自己隐藏的错误造成的。我实现了一些抛出FileNotFoundException的dll劫持对策。实际上,当设置了项目B的正确装配路径时,这对于项目B中引用的第三方应用程序也是有效的。抱歉浪费你的时间......我可以向你保证,在问这个问题之前我浪费了很多时间。问这个问题后,问了问题。现在我要继续...... :)感谢您的所有建议!我会赞成你们两个......
答案 0 :(得分:1)
您可以setup a custom probing path参加第三方大会。请注意,此方法不适用于ASP.NET应用程序(它们不支持自定义探测路径)。
答案 1 :(得分:1)
尝试在resolveEvent处理程序
中使用它return System.Reflection.Assembly.LoadFrom(@"pathOf3rdPartyAssembly")
我经常使用的模式是
Private Sub MyApplication_Startup(sender As Object, e As ApplicationServices.StartupEventArgs) Handles Me.Startup
AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf Me.OnAssemblyResolveHandler
End Sub
Private Function OnAssemblyResolveHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
If args.Name.StartsWith("assemblyName,") Then Return System.Reflection.Assembly.LoadFrom(@"pathOf3rdPartyAssembly")
Return Nothing
End Function
因为resolve事件处理程序期望你返回找到的程序集,或者它将继续使用默认搜索模式然后抛出异常,我建议你实现一种更强大的方法来识别程序集而不是仅使用像我这样的名字!
P.S。这是vb.net,但可以很容易地翻译成c#
Private System.Reflection.Assembly OnAssemblyResolveHandler(Object sender, ResolveEventArgs args)
{
if (args.Name.StartsWith("assemblyName,")) { Return System.Reflection.Assembly.LoadFrom(@"pathOf3rdPartyAssembly"); }
return null;
}