如果库名已更改,AppDomain.CreateInstanceAndUnwrap将失败

时间:2010-01-07 21:24:54

标签: .net security assemblies appdomain manifest

问候,

我有一个允许用户导入他们创建的库(.NET DLL)的应用程序,只要该库符合我给出的特定指南(使用我的命名空间,使用我的属性修饰方法等等)。 )。我将每个用户lib复制到一个内部目录,然后将其加载到自己的应用程序域中(因此用户可以根据需要卸载它)。因此,我有一个限制,你不能加载两个同名的库。

我想删除此限制,而不将每个用户lib放入我的内部目录的唯一子目录中。我将用户lib重命名为内部目录时尝试重命名。例如,如果用户说要导入c:\ SomeLib.dll并且我检测到我已经加载了名为SomeLib.dll的lib,我将新文件复制到... \ MyInternalDir \ SomeLib2.dll。但是,当我这样做时,我的加载命令:

(ISomeInterface) iSomeLib = someAppDomain.CreateInstanceAndUnwrap(
                                    "SomeLib2", 
                                    "SomeNamespace.SomeClassInSomeLib");

抛出异常:

  

FileLoadException:无法加载文件   或汇编'MyLib2'或其中一个   依赖。定位组件   清单定义与之不匹配   装配参考。 (例外   HRESULT:0x80131040)

有没有办法告诉.NET“忽略文件名自编译以来已被更改的事实?”

1 个答案:

答案 0 :(得分:1)

您是否考虑过重载:

someAppDomain.CreateInstanceFrom(string assemblyFile, string typeName)

鉴于您知道新的dll名称,因为您进行了重命名,您可以要求App Domain从指定的dll创建实例。这样它.Net就不应该关心程序集名称和程序集文件名是否匹配。

我应该以“我实际上没有尝试过”开头,但这只是一个建议!