我的项目引用了另一个引用第三方程序集的项目.如何设置此第三方程序集的程序集路径

本文关键字:程序集 第三方 引用 项目 设置 路径 何设置 另一个 我的 | 更新日期: 2023-09-27 18:25:47

我的项目A引用项目B。项目B引用第三方程序集。项目A位于项目B和第三方程序集之外的另一个文件夹中(由于与其他软件集成)。我知道我可以将程序集放在集成文件夹中,但我希望将它们放在我自己的文件夹中,在那里我可以将所有其他程序集以及用于诊断和设置模块的可执行文件放在一起。

我已经在AppDomain.CurrentDomain中订阅了项目A中的MyResolveEventHandler,并且可以成功地设置项目B的正确程序集路径。当项目A调用项目B中使用第三方程序集的方法时,就会出现问题。然后,它为该程序集抛出FileNotFoundException,并显示集成文件夹的路径,而不是我在MyResolveEventHandler中为项目B设置的文件夹。

我已经尝试过AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(@"pathOf3rdPartyAssembly")),它会告诉我它成功地在Appdomain中加载了程序集,但仍然会抛出上面提到的相同的FileNotFoundException

如何从项目A设置项目B中使用的第三方程序集的程序集路径?


编辑: 很抱歉,这个问题是由我自己隐藏的一个错误引起的。我实现了一些dll劫持对策,这些对策抛出了FileNotFoundException。事实上,当为项目B设置了正确的程序集路径时,这对项目B中引用的第三方应用程序也有效。很抱歉浪费您的时间。。。我可以向你保证,在提出这个问题之前、提出这个问题时和提出这个问题之后,我浪费了很多时间。现在我要继续…:)谢谢你的建议!我会支持你们两个

我的项目引用了另一个引用第三方程序集的项目.如何设置此第三方程序集的程序集路径

您可以为第三方程序集设置自定义探测路径。请注意,这种方法不适用于ASP.NET应用程序(它们不支持自定义探测路径)。

尝试在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

因为解析事件处理程序希望您返回找到的程序集,或者它将继续使用默认搜索模式,然后抛出异常,所以我建议您实现一种更强大的方法来识别程序集,而不是像我那样只使用名称!

附言:这是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;
}