作为我之前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(不在主应用程序的子文件夹中)?
我试过了:
<codeBase version="1.0.0.0" href="C:\\Temp\\PROCESSOR\\SKM.dll"/>
- 不起作用,因为它仅适用于子文件夹。<probing privatePath="paths"/>
- 不起作用,因为它仅适用于子文件夹。SKM.dll
已经加载,CLR也看不到我的程序集。答案 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