gpt4 book ai didi

c# - 无法加载位于同一文件夹中的托管程序集

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:13 25 4
gpt4 key购买 nike

为了重新创建我的生产环境,我创建了以下文件夹结构:

c:\TEST\tested.dllc:\TEST\tested\tools.dll

tested.dll 是使用以下 App.config 文件编译的:

  <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="tested"/>
</assemblyBinding>
</runtime>
</configuration>

据我所知,应用程序应该在子文件夹中查找它的工具文件。当我尝试启动该站时,我仍然收到找不到文件的错误。

这里给出一些上下文是一个示例 tested.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;
}
);
}

最佳答案

the tested.dll is compiled using the following App.config file

它需要是一个 yourapp.exe.config 文件,而不是 DLL 的 .config 文件。 CLR 只查找与主进程关联的 .config 文件。

并注意 app.vshost.exe.config,当您在启用托管进程的情况下进行调试时需要它。

在使用单元测试运行程序时要小心,另一个 .exe 文件

请考虑一下这是否真的值得麻烦。您的用户不会关心 DLL 位于何处。

关于c# - 无法加载位于同一文件夹中的托管程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com