C# 动态加载程序集并手动强制路径以获取引用的程序集

C# 动态加载程序集并手动强制路径以获取引用的程序集,c#,reflection,C#,Reflection,我正在使用反射在C#中加载程序集: Assembly = Assembly.Load([assembly_bytestream]); 正在加载的程序集引用了另外两个程序集。据我所知,reflection将加载主程序集,然后在GAC中搜索引用的程序集,如果在那里找不到,则可以导入assemblyResolve事件: AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; Assembly Current

我正在使用反射在C#中加载程序集:

Assembly = Assembly.Load([assembly_bytestream]);
正在加载的程序集引用了另外两个程序集。据我所知,reflection将加载主程序集,然后在GAC中搜索引用的程序集,如果在那里找不到,则可以导入assemblyResolve事件:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
  if (args.Name.IndexOf([refAsm]) > -1)
  {
    Assembly shdocvw = Assembly.LoadFrom([dllPath]);
  }
}

问题是,我不想首先查看GAC,我想强制反射从我定义的特定路径加载引用程序集。您有什么想法吗?

您可以自己加载依赖程序集,然后再加载需要它们的程序集

据我所知,反射将加载主程序集,然后在GAC中搜索引用的程序集

正确,但另一个重要的细节是:框架将先查看应用程序域的搜索路径,然后再查看GAC。通常,应用程序域搜索路径仅包含主EXE所在的目录,但您也可以通过
app.config
或启动第二个应用程序域并以编程方式对其进行配置,将应用程序配置为在特定子目录中查找

相对于应用程序的EXE,引用的程序集位于何处


编辑:调试此类问题时,我总是参考。她的博客的其余部分也充满了类似的有用信息。

Hi Slaks你是说反射会在检查GAC之前检查内存流吗?如果程序集已经加载,它就不会尝试再次加载。听起来很简单。我会试试这个。谢谢Slaks,你帮我指明了正确的方向。不过我是事后做的。基本上首先加载主Assembly:Assembly asm=Assembly.Load([Assembly_ByTestStream]);然后获取所有引用并循环查找我希望从特定位置加载的特定OIN,而不是GAC:AssemblyName[]references=asm.getReferencedAssemblys();foreach(AssemblyName asmName in references){if(asmName.FullName.Contains([name_of_ref_asm]){Assembly shdocvw=Assembly.LoadFrom([dllPath]);}}这是一个ClickOnce应用程序,因此exe位于应用文件夹中的用户ClickOnce缓存下。clickOnce应用程序调用一个web服务,该服务传递一个ByTestStream(有问题的程序集)。正在讨论的程序集的引用程序集位于“应用程序”文件夹中。那么您要查看的具体路径是什么?原始ClickOnce位置?如果是这样,这应该已经起作用了。如果它不工作,那么查看附加到由未能加载程序集触发的异常的fusion日志会很有帮助。程序集确实成功加载,但它从gac加载。我想指定路径。哪个路径-ClickOnce部署目录?如果是这样,则在应用程序目录和GAC中部署了具有相同名称、版本号、公钥令牌和名称的程序集。它们不是相同的二进制文件吗?在这种情况下,从命令行生成自己的互操作(使用TlbImp.exe)并给它们指定一个特定的名称和/或使用自己的私钥对它们进行签名可能更安全。特别是,如果您将自己的私钥提供给它们,则可以保证它们不会与任何其他程序集冲突。