Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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#_.net_.net Assembly_Appdomain_Assembly Loading - Fatal编程技术网

C#组件加载错误的组件

C#组件加载错误的组件,c#,.net,.net-assembly,appdomain,assembly-loading,C#,.net,.net Assembly,Appdomain,Assembly Loading,我已经看到了关于动态加载程序集的问题 基本上,我想做三件事: 1) 动态加载用户选择(托管)的程序集 2) 修改程序集(在程序本身中) 3) 用新组件更换加载的组件 以下代码加载正确的程序集: System.Reflection.Assembly myDllAssembly = System.Reflection.Assembly.LoadFile(assemblyPath); 但是,据我所知,要替换文件,首先需要卸载它以删除文件句柄。因此,我尝试使用下面的代码将文件加载到AppDomain:

我已经看到了关于动态加载程序集的问题

基本上,我想做三件事:

1) 动态加载用户选择(托管)的程序集

2) 修改程序集(在程序本身中)

3) 用新组件更换加载的组件

以下代码加载正确的程序集:

System.Reflection.Assembly myDllAssembly = System.Reflection.Assembly.LoadFile(assemblyPath);
但是,据我所知,要替换文件,首先需要卸载它以删除文件句柄。因此,我尝试使用下面的代码将文件加载到
AppDomain

AppDomain dom = AppDomain.CreateDomain("assemblyLoadDomain");
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = assemblyPath;
Assembly assembly = dom.Load(assemblyName);

// do operation here

AppDomain.Unload(dom);
这将开始在应用程序启动路径中搜索程序集,而不是在
assemblyPath
中定义的路径。如果未找到,则给出FileNotFound异常。我还使用Process Explorer对此进行了验证:它还显示了正在加载的启动路径中的程序集

此外,未卸载程序集


我做错了什么?

您不应该将
Assembly
对象传递回main
AppDomain
,因为这也需要在main
AppDomain
中加载程序集。@PetSerAl我没有将Assembly对象传递给main
AppDomain
。我只是读取一个字符串(从程序集中的函数返回)并卸载程序集。我想在生成的新程序集中更新此字符串。我没有将程序集对象传递给主
AppDomain
。您是:
Assembly=dom.Load(assemblyName)@PetSerAl哦,好的。那么,如何加载文件、执行函数和卸载文件(以便替换文件)?如果不使用
Assembly Assembly=..
,如何使用
GetType()
GetMethod()
函数?