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

Posted

技术标签:

【中文标题】如果库的名称已更改,AppDomain.CreateInstanceAndUnwrap 将失败【英文标题】:AppDomain.CreateInstanceAndUnwrap fails if library's name has been changed 【发布时间】:2010-01-07 21:24:53 【问题描述】:

您好,

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

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

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

抛出异常:

FileLoadException: 无法加载文件 或组装'MyLib2'或其之一 依赖关系。位于的组件的 清单定义不匹配 装配参考。 (例外来自 HRESULT: 0x80131040)

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

【问题讨论】:

【参考方案1】:

您是否考虑过尝试重载:

someAppDomain.CreateInstanceFrom(string assemblyFile, string typeName)

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

我应该以“我还没有真正尝试过”作为开头,但这只是一个建议!

【讨论】:

感谢 Rob 的超快速响应。我最终使用了 CreateInstanceFromAndUnwrap 以尽量减少对算法的更改。 啊,是的 - 当然 - 您在原始示例中使用的是“AndUnwrap”版本 :)

以上是关于如果库的名称已更改,AppDomain.CreateInstanceAndUnwrap 将失败的主要内容,如果未能解决你的问题,请参考以下文章

如果用户已登录,则更改路由名称和组件

更改 Github 存储库的后果

git:比较更改

Android R8(Proguard) 参数名称已更改(我不想更改我的参数名称)

打印定义给定符号的库的名称

我可以更改“nohup.out”的名称吗?