-1

是否可以阻止加载工作目录中的 dll 并强制它在我指定的其他地方使用 dll?

我正在尝试运行一些单元测试并收到此 InvalidCast 异常:

[A]AssemblyA.DataType 不能转换为 [B]AssemblyA.DataType。类型 A 源自位置“E:\webservice\bin\AssemblyA\AssemblyA.dll”的上下文“LoadFrom”中的“AssemblyA, Version=1.0.4645.21698, Culture=neutral, PublicKeyToken=null”。类型 B 源自 'AssemblyA,Version=1.0.4645.21698,Culture=neutral,PublicKeyToken=null',位于位置 'E:\TestResults\Out\AssemblyA.dll' 的上下文 'Default' 中。

在测试启动时,它会调用一些初始化代码,这些代码使用 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\Out\AssemblyA 的类型.dll

在查看了程序集加载的最佳实践之后,似乎没有办法阻止它从工作目录加载 dll,即使我已经手动加载了我想要使用的 dll。除了将应用程序更改为不从 E:\webservice\bin... 加载之外,还有其他选择吗?

(同时使用 LoadFile 或 Load byte[] 也会导致同样的错误)

4

2 回答 2

1

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

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

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

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

于 2012-09-20T07:56:22.130 回答
1

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

于 2013-01-02T21:12:18.563 回答