gpt4 book ai didi

.net - 为什么我不能与在运行时动态加载到同一加载上下文中的程序集共享类型?

转载 作者:行者123 更新时间:2023-12-02 02:37:29 24 4
gpt4 key购买 nike

我在构建插件架构时遇到了一个很常见的问题。

  1. 程序集 A 是核心代码——框架。

  2. 程序集 B 是该代码的插件,预计会在运行时动态加载并使代码可供程序集 A 使用。

在 Visual Studio 中,项目 B(生成程序集 B)引用了项目 A(生成程序集 A),因此它可以引用项目 A 中的类型并正常编译。两个项目都编译无误并生成 DLL。

但是,在运行时,我得到这样的转换异常:

'MyType' cannot be converted to type 'MyType'

我开始明白,在一个项目中定义并在另一个项目中引用的类型在运行时被认为是不同的类型,即使它们在编译时解析得很好。

但是,我认为这可以通过将程序集 B 加载到正确的上下文中来解决。所以我从“Assembly.LoadFrom”切换到“Assembly.Load”并将程序集 B 放在探测路径中。这个想法是它会加载到与程序集 A 相同的上下文中,并且它们将是一个幸福的大家庭。

我下载了 Fusion 日志查看器并观察了程序集的加载。程序集 A 和程序集 B 都像这样加载:

Assembly is loaded in default load context.

因此,我确保它们都加载到相同的加载上下文

不过,我无法在两个程序集之间共享类型。当我尝试将对象(其类型在程序集 A 中定义)作为参数从程序集 A 中的代码传递到程序集 B 中对象的方法时,我遇到了转换错误。

总结:

  1. MyType 在程序集 A 中定义

  2. 从程序集 A,我在运行时使用“Assembly.Load”将程序集 B 加载到相同的加载上下文中

  3. 在程序集 A 中,我使用反射调用程序集 B 中类的静态方法。我将 MyType 的对象作为参数传递给此方法(这是预期的,并且编译得很好)。

  4. 失败:“MyType”无法转换为“MyType”类型

如果重要的话,这是我用来调用该方法的代码。此代码在程序集 A 中执行:

TypeFromAssemblyB.GetMethod("MyMethod").Invoke(null, new object[] { ObjectOfTypeDefinedInAssemblyA });

最佳答案

我确信这应该像您所描述的那样工作,所以我写了一个快速而粗略的示例。我的入门程序集称为 PluginTest 并包含以下类:

namespace PluginTest
{
public class MyType
{
public string Data { get; set; }
}
}

我的插件程序集称为 Plugin。它引用了 Visual Studio 中的 PluginTest 项目,并且只包含这个类:

using System;
using PluginTest;

namespace Plugin
{
public class Class1
{
public static void ShowData(MyType input)
{
Console.WriteLine(input.Data);
}
}
}

终于回到 PluginTest(可执行文件),我在 Main 中有这段代码:

static void Main(string[] args)
{
Assembly pluginAssembly = Assembly.LoadFrom("Plugin.dll");

Type pluginType = pluginAssembly.GetType("Plugin.Class1");

MethodInfo mi = pluginType.GetMethod("ShowData");

mi.Invoke(null, new object[]
{
new MyType {Data = "Hello World"}
});

Console.ReadLine();

}

正如预期的那样,这会弹出一个控制台窗口并向其中写入“Hello World”。所以,原则上,您尝试做的事情应该有效...

(在预览时,我喜欢 Jonathan 的想法,它可能是版本不匹配 - 对整个解决方案进行全新构建,并确保将所有 dll 复制到正确的文件夹)

关于.net - 为什么我不能与在运行时动态加载到同一加载上下文中的程序集共享类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/787444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com