C# 从扩展主机应用程序类型的 DLL 创建类型的实例

C# create instance of type from DLL extending host application type

这是否可能,如果不能,有人可以解释一下我如何实现它吗?

所以我有一个 C# 应用程序和一个名为模块的文件夹,所以文件:

Application.exe
modules/
        Application.Handler.ModuleName.dll

所以在 DLL 内部它有命名空间 Application.Handle 包含类型 ModuleNameModuleName 扩展 Handler 在 Application.exe 中实现以便编译需要 Application.exe 作为参考。

在我的主机应用程序中我有:

 string[] dirs = Directory.GetFiles(@"modules/", "Application.Handler.*.dll");
 foreach(string filePath in dirs)
 {
      Assembly.LoadFile(new FileInfo(filePath).FullName);

      string fileName = filePath.Split('/').Last();
      string typeAssemblyName = fileName.Replace(".dll", "");
      string typeName = typeAssemblyName.Split('.').Last();
 }

但我不确定我是否可以从我认为可以使用 Activator.CreateInstance 的字符串中实现类型,但我不确定我是否做对了或者我正在尝试的方式实施它有效吗?

更新 我可能不清楚,但实际上我需要做的是 Application.Handler handler = new Application.Handler.ModuleName() php 中的 Application.Handler.ModuleName 如下所示,我认为会有一个系统 returns 字符串中给定类型的对象。如果不存在则抛出异常

$className = "\Application\Handler\ModuleName"; 
$instance = new $className();

我也尝试过使用@rene 建议的 Unwrap 系统

Assembly asm = Assembly.LoadFile(new FileInfo(filePath).FullName);

string fileName = filePath.Split('/').Last();
string typeAssemblyName = fileName.Replace(".dll", "");
string typeName = typeAssemblyName.Split('.').Last();
FrameHandler fh;
fh = (FrameHandler)Activator.CreateInstance(asm.FullName, typeAssemblyName).Unwrap();
fh.RegisterHandlers();

使用这种方法,我给它 Assembly 名称,它给我一个 FileNotFoundException,没有 Assembly 名称,我得到 TypeLoadException,但它必须加载程序集清单为 Application.Handler.ModuleName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

您只需要类型的句柄,因此您需要程序集路径和类型的全名

var assy = Assembly.LoadFile("...");
var type = assy.GetType("...");
var obj = Activator.CreateInstance(type);