`Assembly.Load`在一个单独的文件夹中

时间:2015-06-05 07:48:56

标签: c#

作为我之前question的延续。

我通过此代码加载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也看不到我的程序集。

2 个答案:

答案 0 :(得分:3)

我找到了解决方案here

只需向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。

答案 1 :(得分:0)

如果您知道DLL的位置,是否有任何特殊原因您不想使用示例1?

如果你真的没有,那么一个选择就是在GAC注册DLL。

https://msdn.microsoft.com/en-us/library/dkkx7f79%28v=vs.110%29.aspx