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



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

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

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

因此,在 DLL 中,它具有包含ModuleName类型的命名空间Application.HandleModuleName扩展了在应用程序中实现的Handler.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的地方,它像下面这样完成,我认为会有一个系统返回字符串中给定类型的对象。如果不存在,则引发异常

$className = "ApplicationHandlerModuleName"; 
$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);

相关内容

最新更新