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

时间:2012-05-24 14:10:40

标签: c# app-config .net-assembly probing

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

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;
            }
        );
    }

1 个答案:

答案 0 :(得分:0)

  

tests.dll是使用以下App.config文件

编译的

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

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

请注意使用单元测试运行器,另一个.exe文件

请考虑这是否真的值得麻烦。您的用户不关心DLL的位置。