gpt4 book ai didi

c# - 如何将参数传递给通过 Assembly.CreateInstance 加载的 C# 插件?

转载 作者:太空狗 更新时间:2023-10-29 22:08:59 26 4
gpt4 key购买 nike

我现在拥有的(成功加载插件)是这样的:

Assembly myDLL = Assembly.LoadFrom("my.dll");
IMyClass myPluginObject = myDLL.CreateInstance("MyCorp.IMyClass") as IMyClass;

这仅适用于具有不带参数的构造函数的类。如何将参数传递给构造函数?

最佳答案

你不能。而是使用 Activator.CreateInstance如下例所示(请注意,Client 命名空间位于一个 DLL 中,Host 位于另一个 DLL 中。两者必须位于同一目录中,代码才能正常工作。)

但是,如果你想创建一个真正可插入的接口(interface),我建议你使用一个 Initialize 方法,它在你的接口(interface)中接受给定的参数,而不是依赖于构造函数。这样你就可以只要求插件类实现你的接口(interface),而不是“希望”它接受构造函数中接受的参数。

using System;
using Host;

namespace Client
{
public class MyClass : IMyInterface
{
public int _id;
public string _name;

public MyClass(int id,
string name)
{
_id = id;
_name = name;
}

public string GetOutput()
{
return String.Format("{0} - {1}", _id, _name);
}
}
}


namespace Host
{
public interface IMyInterface
{
string GetOutput();
}
}


using System;
using System.Reflection;

namespace Host
{
internal class Program
{
private static void Main()
{
//These two would be read in some configuration
const string dllName = "Client.dll";
const string className = "Client.MyClass";

try
{
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
Type classType = pluginAssembly.GetType(className);

var plugin = (IMyInterface) Activator.CreateInstance(classType,
42, "Adams");

if (plugin == null)
throw new ApplicationException("Plugin not correctly configured");

Console.WriteLine(plugin.GetOutput());
}
catch (Exception e)
{
Console.Error.WriteLine(e.ToString());
}
}
}
}

关于c# - 如何将参数传递给通过 Assembly.CreateInstance 加载的 C# 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/134481/

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