如何将此程序集加载到我的 AppDomain 中?

Posted

技术标签:

【中文标题】如何将此程序集加载到我的 AppDomain 中?【英文标题】:How to load this assembly into my AppDomain? 【发布时间】:2015-10-05 05:54:41 【问题描述】:

我已经搜索了这个地狱,但是当文件明确存在并且可以使用 File.ReadAllBytes 打开时,我无法完全找出为什么我会收到 FileNotFoundException

这是我当前的代码:

AppDomainSetup domainInfo = new AppDomainSetup();
domainInfo.ApplicationBase = PluginDirectory;
Evidence adEvidence = AppDomain.CurrentDomain.Evidence;
AppDomain pluginDomain = AppDomain.CreateDomain("pluginDomain", adEvidence, domainInfo);

foreach (FileInfo file in files)

    if (m_AssemblyIgnoreList.Contains(file.Name))
        continue;

    byte[] assemblyBytes = File.ReadAllBytes(file.FullName);
    //Assembly plugin = Assembly.LoadFrom(file.FullName);

    Assembly plugin = pluginDomain.Load(assemblyBytes);

    LoadPlayerEvents(plugin);


AppDomain.Unload(pluginDomain);

我正在尝试从插件文件夹中加载所有 .dll 文件,并加载一堆属性类型和函数。

当我使用 Assembly.LoadFrom(file.FullName) 时,属性类型和函数的加载工作文件。但是,pluginDomain.Load(assemblyBytes) 会导致以下异常:

FileNotFoundException: Could not load file or assembly 'Example Mod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

它肯定会找到指定的文件,因为 File.ReadAllBytes 可以完美运行,因为异常会显示我要加载的程序集的全名。因此我得出结论,它无法加载依赖项。

所有依赖项都已加载到 CurrentDomain。虽然,即使我将这些依赖项放在 .dll 旁边(无论如何,这都会发生在所述 .dll 的构建期间),也会产生相同的异常。

当文件明确存在时,为什么我会收到此异常?

【问题讨论】:

您可以运行 Process Monitor 来检查您的应用程序在哪些位置搜索 dll,也许您知道为什么它没有在您想要的位置搜索。 【参考方案1】:

您应该在当前域的 AssemblyResolve 事件处理程序中加载程序集,如 here 解释的那样

【讨论】:

我正在尝试不使用 Assembly.Load,因为它会一直使用 dll 文件,直到卸载 appdomain。我希望能够在加载所有插件后立即卸载 appdomain,并且我需要的每个方法的 MethodInfo 变量都存储在列表中。这样我以后就可以调用这些方法了。 是的,但是 dll 将被加载到新创建的域中,因此一旦它被卸载,dll 将被释放。也许我写错了:“当前”域是指您刚刚创建的域。请注意,AppDomain.Load 和事件处理程序都是静态的,因此称为新创建的域。示例中的解决方案应该适合您的目的。如果您需要代码示例,请告诉我。 我刚刚注意到,你写了你想在之后调用这些方法。这是不可能的,因为它们被加载到的域中,被卸载了。您需要将 dll 加载到某个域中才能使用它们。您可以通过创建一个单独的域并按需加载必要的 dll 来动态地执行此操作,但恐怕这不会有效率。你到底想在这里完成什么?此外,通过将 MethodInfo 变量存储在基础域中来引用这两个域,可能会阻止卸载。你需要为它找到一个不同的解决方案。

以上是关于如何将此程序集加载到我的 AppDomain 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何重新加载在浏览器中运行 Silverlight 应用程序的默认 AppDomain?

将 c# 程序集动态加载和卸载到 appdomain

如何在新的 AppDomain 中运行从加载到引用的程序集的方法

无法在 appDomain 中加载程序集

如果存在某个属性,则加载程序集

将清单程序集动态加载到 appdomain