[英]C# create instance of type from DLL extending host application type
这是否可能,如果不能有人请解释一下我如何实现这一工作?
所以我有一个C#应用程序和一个带有模块的文件夹,称为模块,因此文件:
Application.exe
modules/
Application.Handler.ModuleName.dll
因此,在DLL中,它具有名称空间Application.Handle
其中包含类型ModuleName
和ModuleName
扩展了在Application.exe中实现的Handler
,因此要进行编译,需要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 = "\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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.