C# 从扩展主机应用程序类型的 DLL 创建类型的实例
C# create instance of type from DLL extending host application type
这是否可能,如果不能,有人可以解释一下我如何实现它吗?
所以我有一个 C# 应用程序和一个名为模块的文件夹,所以文件:
Application.exe
modules/
Application.Handler.ModuleName.dll
所以在 DLL 内部它有命名空间 Application.Handle
包含类型 ModuleName
和 ModuleName
扩展 Handler
在 Application.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
如下所示,我认为会有一个系统 returns 字符串中给定类型的对象。如果不存在则抛出异常
$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);
这是否可能,如果不能,有人可以解释一下我如何实现它吗?
所以我有一个 C# 应用程序和一个名为模块的文件夹,所以文件:
Application.exe
modules/
Application.Handler.ModuleName.dll
所以在 DLL 内部它有命名空间 Application.Handle
包含类型 ModuleName
和 ModuleName
扩展 Handler
在 Application.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
如下所示,我认为会有一个系统 returns 字符串中给定类型的对象。如果不存在则抛出异常
$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);