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