在单独的文件夹中使用 `Assembly.Load`

3
作为我之前提出的问题的延续。
我通过以下代码加载DLL。 示例1:
var assembly = Assembly.LoadFile("C:\\Temp\\PROCESSOR\\SKM.dll");

我使用了序列化,它内部使用了这段代码,例如2:

而且这个工作得很好。

var ass1 = Assembly.Load("SKM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

这段代码会抛出异常:System.Runtime.Serialization.SerializationException: Unable to find assembly "SKM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null".因为DLL在一个单独的文件夹中。

如何强制CLR在单独的目录中看到DLL(而不是主应用程序的子文件夹)?

我尝试了以下方法:

  1. <codeBase version="1.0.0.0" href="C:\\Temp\\PROCESSOR\\SKM.dll"/> - 不起作用,因为它只适用于子文件夹。
  2. <probing privatePath="paths"/> - 不起作用,因为它只适用于子文件夹。
  3. 先运行第一个示例,然后再运行第二个示例。但即使SKM.dll已加载,CLR也无法看到我的程序集。

1
顺便提一下,您正在获取完整路径的 FullPath()。 - H H
@HenkHolterman 谢谢,我已经修复了)) - Stas BZ
1
也许捕获AppDomain.AssemblyResolve事件并从中调用Assembly.LoadFrom方法,使用fullPath作为参数是一个选项。 - Ralf
1
这可能会有帮助:https://dev59.com/vXM_5IYBdhLWcg3wcSx_ - Nazmul
1
将您的问题标记为“已解决”的正确方法不是更改标题,而是发布您的问题的答案(您已经完成了这一步),并将该答案标记为被接受的答案(您尚未完成此步骤)。 - Peter Duniho
2个回答

3
我在这里找到了解决方案:链接。 只需添加一个事件到 AssemblyResolve 中:
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    string fileName = new AssemblyName(args.Name).Name + ".dll";
    string assemblyPath = Path.Combine("C:\\Temp\\PROCESSOR", fileName);
    var assembly = Assembly.LoadFile(assemblyPath);
    return assembly;
};

如果标准方式找不到 DLL,就会触发事件并从我的文件夹加载 DLL。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接