是否可以阻止加载工作目录中的dll并强制它在我指定的其他地方使用dll?
我正在尝试运行一些单元测试并获得此InvalidCast异常:
[A] AssemblyA.DataType无法强制转换为[B] AssemblyA.DataType。 A型 起源于'AssemblyA,Version = 1.0.4645.21698,Culture = neutral, 位于“LoadFrom”上下文中的PublicKeyToken = null' 'E:\ web服务\ BIN \ AssemblyA \ AssemblyA.dll'。 B型起源于 'AssemblyA,Version = 1.0.4645.21698,Culture = neutral, 位于上下文'Default'的PublicKeyToken = null' 'E:\ TestResults \缺货\ AssemblyA.dll'。
在测试启动时,它调用一些初始化代码,使用Assembly.LoadFrom从E:\ webservice \ bin \ AssemblyA \ AssemblyA.dll加载dll并创建一些类型并将它们放在缓存中。
有一些后期构建事件可以将dll复制到该位置,因此它们在两个位置都是完全相同的dll。
但单元测试是从E:\ testresults \ out \的工作目录运行的,所以它会自动加载AssemblyA.dll,忽略已经加载的程序集,而没有让我有机会用Appdomain拦截那个加载.AssemblyResolve事件
因此,当单元测试代码尝试从E:\ webservice \ bin \ AssemblyA \ AssemblyA.dll放置的缓存中检索对象时,它表示无效的转换,因为它期望来自E:\ TestResults \的类型出\ AssemblyA.dll
查看Best Practices for Assembly Loading之后,似乎没有办法阻止它从工作目录加载dll,即使我已经手动加载了我想要使用的dll。除了将应用程序更改为不从E:\ webservice \ bin中加载之外,还有其他选项吗?
(使用LoadFile或Load byte []也会导致相同的错误)
答案 0 :(得分:1)
现在,我试着帮助你解决问题..
我建议使用StrongName为您的程序集签名。
CLR使用它来识别程序集。这几乎不能解决您的问题。 但是为了解决你的问题,我建议使用一个接口来封装你的不同类型。因此,您可以在缓存中存储任何类型并仅返回intrerface,并且转换已经消失。
如果这不能解决您的问题,您必须向我提供更多信息。
答案 1 :(得分:1)
正如Panos在上面的评论中所建议的,这是通过在引用的程序集上设置CopyLocal = false来解决的。这样CLR就不能尝试从工作目录加载dll,因为dll不在那里。