Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C从扩展主机应用程序类型的DLL创建类型的实例_C#_Dll_.net Assembly - Fatal编程技术网

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

C# C从扩展主机应用程序类型的DLL创建类型的实例,c#,dll,.net-assembly,C#,Dll,.net Assembly,如果不可能的话,有人能解释一下我是如何实现这一点的吗 我有一个C应用程序和一个名为modules的文件夹,所以文件: Application.exe modules/ Application.Handler.ModuleName.dll 因此,在DLL内部有名称空间Application.Handle,其中包含类型ModuleName和ModuleName扩展了在Application.exe中实现的处理程序,因此编译需要Application.exe作为引用 在我的主机应用程

如果不可能的话,有人能解释一下我是如何实现这一点的吗

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

Application.exe
modules/
        Application.Handler.ModuleName.dll
因此,在DLL内部有名称空间Application.Handle,其中包含类型ModuleName和ModuleName扩展了在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,其中Application.Handler.ModuleName在php中是这样做的,我认为会有一个系统返回字符串中给定类型的对象。如果不存在,则抛出异常

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

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();

使用这个方法,我给它一个程序集名称,它给我一个FileNotFoundException,没有程序集名称,我得到TypeLoadException,但它必须加载程序集的清单作为Application.Handler.ModuleName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null

您只需要一个类型句柄,因此,您需要程序集路径和类型的全名


你不能使用吗?我得到的只是类型或名称空间“Composition”不存在于…我至少要确保共享的接口在应用程序和插件DLL引用的单独程序集中声明。通过这样做,您将避免循环依赖项/引用。我没有循环依赖项模块依赖于主机进行编译,但当我将其作为程序集加载时,我不需要再次加载主机应用程序,因为名称空间和类型已经存在@spenderI认为您必须更新才能使用我的代码,例如var type=asm.GetTypeTypeAssemblyName这是不必要的-我不知道您的类型或程序集的名称,为什么我要在回答中包含它?您可以通过在包含类型名的程序集中对其调用type.FullName或更好的-type.AssemblyQualifiedName来找到类型名。这是我的观点,如果您阅读了我的问题和代码,您将获得这些信息,并且您可以对该问题给出完整而有意义的完整答案。。。
var assy = Assembly.LoadFile("...");
var type = assy.GetType("...");
var obj = Activator.CreateInstance(type);