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

时间:2017-03-05 19:21:11

标签: c# dll .net-assembly

这是否可能,如果没有,请解释我如何实现这个工作?

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

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

因此,在DLL内部,它具有名称空间Application.Handle,其中包含在Application.exe中实现的类型ModuleNameModuleName extends Handler,因此要编译需要{{1作为参考。

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

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在php中Application.Handler handler = new Application.Handler.ModuleName()如下所示,我认为会有一个系统返回字符串中给定类型的对象。如果它不存在抛出异常

Application.Handler.ModuleName

我也尝试过使用@rene建议的$className = "\Application\Handler\ModuleName"; $instance = new $className(); 系统

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

1 个答案:

答案 0 :(得分:1)

您只需要一个类型的句柄,因此您需要装配路径和类型的全名

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