Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态加载DLL的程序集引用_C#_Reflection_Assemblies_Reference - Fatal编程技术网

C# 动态加载DLL的程序集引用

C# 动态加载DLL的程序集引用,c#,reflection,assemblies,reference,C#,Reflection,Assemblies,Reference,我有4个组件: Tester.exe ToyInterface.dll ToyFactory.dll-->引用(ToyInterface.dll) Toy.dll-->引用(ToyInterface.dll) Tester.exe internal ICollection<string> Scan(string path){ return ToyCollection = _reportFactoryType.GetMethod(FACTORY_GET_TOYS).

我有4个组件:

  • Tester.exe
  • ToyInterface.dll
  • ToyFactory.dll-->引用(ToyInterface.dll)
  • Toy.dll-->引用(ToyInterface.dll)
  • Tester.exe

    internal ICollection<string> Scan(string path){
      return ToyCollection = _reportFactoryType.GetMethod(FACTORY_GET_TOYS).
                                Invoke(_ToyFactory, null);
    }
    
    内部ICollection扫描(字符串路径){
    return-ToyCollection=\u reportFactoryType.GetMethod(FACTORY\u GET\u玩具)。
    调用(_ToyFactory,null);
    }
    
    ToyFactory.dll

    ...try
    {
    // Load assembly:
        Assembly asm = Assembly.LoadFrom(fileFullPath);
        // Reflect ToyInterface types:
        IEnumerable<Type> types = asm.GetExportedTypes();
    }
    
    …试试看
    {
    //加载组件:
    Assembly asm=Assembly.LoadFrom(fileFullPath);
    //反射到接口类型:
    IEnumerable types=asm.GetExportedTypes();
    }
    
    我收到一个例外

    无法加载文件或程序集 'ToyInterface,版本=1.0.0.0, 区域性=中性,PublicKeyToken=空' 或者它的一个依赖项。系统 找不到该文件 指定。“:”ToyInterface, 版本=1.0.0.0,区域性=中性, PublicKeyToken=null


    fuslogvw.exe中的绑定信息显示程序集是在Tester.exe环境路径中访问的。为什么会这样,我怎样才能改变这一点

    是否尝试将所有程序集放在同一目录中?

    您没有指定,但我假设Toy.exe也依赖于所有其他DLL?正确的?因为如果不是,那么编译过程不会将它们复制到Toy.exe的run executable目录中。检查durectory,确保所有三个DLL都在那里,并且都是最新编译时的日期戳

    如果只是kewl,那么可能是ToyInterface.dll依赖于Visual Studio开发文件夹中的某个其他dll(未提及),但未复制到运行时文件夹中

    如果您正在动态加载这些其他DLL,请不要;不要错误地假设他们自己加载自己的依赖DLL。所有从属DLL都是基于可执行程序集的基本代码文件夹(从中加载的文件夹)加载的,而不是程序集.LoadFrom方法可能正在执行的DLL文件夹。。。因此,如果您希望从Toy.exe的load文件夹(或该文件夹的s子目录)以外的其他位置加载dll,请尝试在
    Assembly.LoadFrom()方法中指定dll的完全限定绝对路径,然后查看是否解决了问题。

    我发现了问题! 看来我一直在忍受地狱的折磨(

    帮助我发现我需要使用
    Assembly.LoadFrom()
    函数,而不是
    Assembly.LoadFile()
    。 现在,正在正确的目录中探测Aseembly及其依赖项


    谢谢大家的帮助!

    这就是重点。我不希望它们在同一个目录中。为什么测试仪和玩具必须在一起?当你编译Toy.exe时,如果它(或任何依赖的dll),具有对任何dll的引用,Visual Studio编译应将该dll全部放入输出目录中…除非其中一个dll已在GAC中注册…是这样吗?如果不希望dll位于同一输出文件夹中,则必须1)在GAC中注册它们。2) 动态加载它们,或者3)使用复杂的CLR加载程序版本策略配置文件。Charles,我正在动态加载它们。这就是重点。Tester.exe不依赖于ToyFactory.dll或Toy.dll。它们不会复制到Tester.exe文件夹。这就是为什么找不到它们。请解释“使用复杂的CLR加载程序版本策略配置文件”。?Toy.dll只知道ToyInterface.dll它是从ToyFactory.dll动态加载的,ToyFactory.dll也是从Tester.exe动态加载的。不知怎的,Toy.dll正在Tester.exe的环境路径中查找其依赖项。您误解了,所有程序集都加载到单个AppDomain和单个进程空间中,即加载toy.exe时最初创建的AppDomain/进程空间。因此,Toy.exe加载的文件夹是defualt加载文件夹。所以toy.dll无法加载任何内容。。。尽管加载其依赖项的代码行位于toy.dll中,但加载的始终是toy.exes的AppDomain和进程。由于您正在动态加载这些其他dll,请尝试在Assembly.LoadFrom()方法中显式指定dll的完整绝对路径,看看这是否可以解决问题。