Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# 对已加载程序集的引用_C#_Reflection_.net 4.0 - Fatal编程技术网

C# 对已加载程序集的引用

C# 对已加载程序集的引用,c#,reflection,.net-4.0,C#,Reflection,.net 4.0,我不知道如何最好地描述这个。但我在理解程序集的加载过程时遇到问题。 我的应用程序通过反射使用插件。它工作得很好,我对此很满意。现在我偶然发现了一个让我困惑的问题,我想我错过了什么: 在我的一个模块中,我引用了另一个模块。在运行时加载所有模块。有模块ClientManager和调用模块计算。ClientManager和计算都已加载。计算引用ClientManager。当Calculations尝试加载ClientManager类时,我得到一个文件未找到异常。 这两个程序集都是从内存中的ByTest

我不知道如何最好地描述这个。但我在理解程序集的加载过程时遇到问题。
我的应用程序通过反射使用插件。它工作得很好,我对此很满意。现在我偶然发现了一个让我困惑的问题,我想我错过了什么:
在我的一个模块中,我引用了另一个模块。在运行时加载所有模块。有模块ClientManager和调用模块计算。ClientManager和计算都已加载。计算引用ClientManager。当Calculations尝试加载ClientManager类时,我得到一个文件未找到异常。
这两个程序集都是从内存中的ByTestStream加载的(通过Assembly.Load(字节[])。
当Calculations尝试加载ClientManager类时,情况如下:

已加载:mscorlib,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089
更多的组件…
已加载:ClientManager,版本=1.0.0.0,区域性=中立,PublicKeyToken=null
已加载:计算,版本=1.0.0.0,区域性=中立,PublicKeyToken=null
要加载的程序集名称:ClientManager, 版本=1.0.0.0,区域性=中立,PublicKeyToken=null
请求自:Calculations,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null

因此,程序集已加载,但它被请求,请求失败。我缺少什么?我必须加载程序集两次吗

我很感激你的帮助

您好,

Skalli

您的问题与我在开发插件时遇到的问题非常相似:

我认为您应该首先了解.NET在哪里查找您的程序集,并将其与AppDomain中已加载的程序集进行比较。这可以通过使用ProcMon.exe查看应用程序在哪里找不到程序集,并查看您可以在AppDomain.CurrentD中找到的ClientManager的CodeBase属性来完成omain.getAssemblys()

我想这两条路径会有所不同,但很难想象为什么你的应用程序在不知道的情况下在不同的地方寻找程序集

最后,我也使用AssemblyResolve事件解决了我的问题,只需在当前加载的程序集中查找我的程序集,然后重新编写它(无需再次加载)

我就是这样做的。我不太确定它是否真的很整洁,因为它只能工作,因为找不到的程序集已经加载:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    foreach (Assembly anAssembly in AppDomain.CurrentDomain.GetAssemblies())
        if (anAssembly.FullName == args.Name)
            return anAssembly;
    return null;
}

应该能够只加载第一个程序集,并且只要辅助程序集位于同一位置,它们就应该自己加载。它们位于不同的目录中。每个模块都有自己的目录。让我困惑的是,我必须加载程序集,即使它已经加载到AppDomain中。加载并不麻烦再次加载程序集,但我不明白为什么现在有必要这样做。如果Plugin1.dll引用PluginHelper1.dll,然后将它们放在同一个目录中,加载Plugin1.dll,您就可以开始了。确定它们加载在同一个应用程序域中吗?您应该显式指定应用程序域。这是一个我从未遇到过的奇怪问题以前输入过。您是否尝试过使用ILMerge将主程序集和辅助程序集合并为一个二进制程序集?作为一个实验,尝试一下,看看您是否仍然存在相同的问题。感谢您的回答。您的解决方案听起来非常简洁,我会在有时间时立即尝试。现在,我已经解决了ILMerge的问题,即使它已经解决了一些缺点(没有编辑并继续,项目输出与ILMerge输出不同,这在使用WiX时很麻烦…)。我可以问一下您是如何返回加载的程序集的吗?我会将您的帖子标记为答案,即使我还不能尝试。如果我尝试了,我会更新我的进度。