如果不是,这是否可能,有人可以解释一下我如何实现它来工作?
所以我有一个 C# 应用程序和一个叫做模块的文件夹,所以文件:
Application.exe
modules/
Application.Handler.ModuleName.dll
因此,在 DLL 中,它具有包含ModuleName
类型的命名空间Application.Handle
ModuleName
扩展了在应用程序中实现的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);