防止在工作目录中加载dll,InvalidCastException类型A无法强制转换为类型B.

时间:2012-09-19 19:21:36

标签: c# .net assemblies appdomain

是否可以阻止加载工作目录中的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 []也会导致相同的错误)

2 个答案:

答案 0 :(得分:1)

现在,我试着帮助你解决问题..

我建议使用StrongName为您的程序集签名。

CLR使用它来识别程序集。这几乎不能解决您的问题。 但是为了解决你的问题,我建议使用一个接口来封装你的不同类型。因此,您可以在缓存中存储任何类型并仅返回intrerface,并且转换已经消失。

如果这不能解决您的问题,您必须向我提供更多信息。

答案 1 :(得分:1)

正如Panos在上面的评论中所建议的,这是通过在引用的程序集上设置CopyLocal = false来解决的。这样CLR就不能尝试从工作目录加载dll,因为dll不在那里。