3

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

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

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

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


编辑: 对不起,问题是由我自己一个隐藏得很好的错误引起的。我实现了一些抛出 FileNotFoundException 的 dll 劫持对策。实际上,当为项目 B 设置正确的组装路径时,这对于项目 B 中引用的第 3 方应用程序也是有效的。抱歉浪费您的时间...我可以向您保证,在问这个问题之前我浪费了很多时间,当问问题,问问题后。现在我要继续前进了... :) 感谢您的所有建议!我会为你们两个点赞...

4

2 回答 2

1

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

于 2013-07-31T09:02:21.653 回答
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

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

ps 这是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;
}
于 2013-07-31T12:24:45.433 回答