要重新创建我的生产环境,我创建了以下文件夹结构:
C:\ TEST \ tested.dll C:\ TEST \测试\ tools.dll
使用以下App.config文件编译了tests.dll:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="tested"/>
</assemblyBinding>
</runtime>
</configuration>
据我所知,应用程序应该在子文件夹中查找它的工具文件。当我尝试启动工作站时,仍然会收到找不到文件的错误。
这里给出一些上下文是一个示例tests.dll源:
namespace ConsoleApplication1
{
public static class Testable
{
public static tools.IToolAble usefultool = null;
public static void initialisation()
{
if (usefultool == null) usefultool = new UsefulTest()
}
}
public class UsefulTest : tools.IToolAble
{
}
}
和一个示例tools.dll源:
namespace tools
{
public interface IToolAble
{
}
}
崩溃的代码是我的测试代码,其工作原理如下:
private CustomMock controller = new CustomMock();
public void TestFixtureSetUp()
{
controller.LoadFrom(@"c:\TEST\tested.dll");
//The next line crashes because tools assembly is needet but not found
controller.InvokeInitialisation();
}
我错过了什么? App.config是否正确?
编辑:
下面的答案是正确的,只有选择了正确的dll后才能知道路径。因此,其他团队必须在加载前添加new ResolveEventHandler
。这是简化版本:
internal void AddResolveEventHandler(string assemblyname, string assemblylocation)
{
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler(
(sender, args) =>
{
Assembly ret = null;
if (
new AssemblyName(args.Name).Name == assemblyname &&
File.Exists(assemblylocation))
{
ret = Assembly.LoadFrom(assemblylocation);
}
return ret;
}
);
}
答案 0 :(得分:0)
tests.dll是使用以下App.config文件
编译的
它必须是yourapp.exe.config文件,而不是DLL的.config文件。 CLR只查找与主进程关联的.config文件。
注意app.vshost.exe.config,在启用托管进程的情况下进行调试时需要。
请注意使用单元测试运行器,另一个.exe文件
请考虑这是否真的值得麻烦。您的用户不关心DLL的位置。