繁体   English   中英

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扩展了在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM