我们在本地代码中做了类似的事情。您可以在运行时加载程序集,使用反射扫描其中包含的类型,然后再次使用反射调用函数并从该 dll 实例化类型,而无需在项目中直接引用它。
您需要的一些关键功能是:
Assembly.LoadFrom(path); //get the assembly as a local object
Activator.CreateInstance(type); //create an instance of a type
Assembly.GetType(string);//fetch a type by name from the assembly
一旦你有了类型,基本的反射就会给你几乎所有你需要的东西。
这是我本地代码的片段:
asm = Assembly.LoadFrom(Path.Combine(Environment.CurrentDirectory, filePath));
Type[] types = asm.GetTypes();
for (var x = 0; x < types.Length; x++)
{
var interfaces = types[x].GetInterfaces();
for (var y = 0; y < interfaces.Length; y++)
{
if (interfaces[y].Name.Equals("MyTypeName"))
{
isValidmod = true;
var p = (IMyType)Activator.CreateInstance(types[x]);
//Other stuff
}
}
另请注意:这是现在很旧的代码。多年来,它既没有被审查也没有被重构,所以它从 .NET 1.1 开始基本上是现代的,但是:它说明了这一点。如何从本地未引用的远程程序集中加载类型。
此外,这是一个引擎的一部分,可以加载其中的大约 50 个,给定一个严格的文件夹结构,这就是它看起来如此通用的原因。从中获取你需要的东西。