2012-04-13 160 views
1

我有一个使用第三方库执行特定任务的WPF应用程序;该库在其一种方法中执行语句Assembly.GetEntryAssembly()GetEntryAssembly返回null ...如何避免它?

如果我在调试时运行WPF应用程序(通过运行.Net EXE进行测试),该库工作正常,并且Assembly.GetEntryAssembly()返回对可执行文件的程序集的引用,但在生产中,我遇到了一些不同的情况,问题。

在生产中,WPF应用程序与VB6应用程序集成在一起,并且使用InteropFormLibrary从VB6菜单启动程序;在这种情况下,库引发异常,因为Assembly.GetEntryAssembly()返回null(它找不到与程序集关联的可执行文件)。

我的问题是,我无法更改库的代码,因为我没有可用的源代码,并且发现反编译器会抛出异常,并分析出现异常的方法。

现在我的问题是:有什么办法可以确保方法GetEntryAssembly不返回null?我能以某种方式分配或“绕过”吗?

+1

是否有可能在新的AppDomain中执行WPF应用程序? – Matten 2012-04-13 09:05:13

+0

我在尝试,但是互操作存在一些问题 – 2012-04-13 09:41:40

+0

最简洁的方法是联系库开发人员,因为MSDN声明如果从非托管代码调用GetEntryAssembly将返回null。 http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.100%29.aspx – Matten 2012-04-13 09:46:37

回答

1

最简单的方法是让开发人员修复他的代码以支持在本地(如VB6或C/C++)进程中托管。这就是说,如果不可能,你可以尝试在一个单独的进程中托管你的.NET端,基于.NET EXE。既然你正在做VB6互操作,你可能已经在使用COM互操作了,所以你可以切换到out-of-process COM模型。这样你的.NET组件就可以运行在一个.NET exe文件中,并且拥有一个入口点程序集。由于类似的原因,我已经这样做了,它对我来说工作得很好。

+0

是的......它似乎是我试图联系库开发人员来解决问题 – 2012-04-13 09:31:18

+0

我发现的另一个“临时”和“危险”解决方案是使用MSIL反汇编程序(从使用ildasm命令的提示符)修改语句,然后重新编译dll(使用ilasm命令)。它有效,但它不是最好的选择。 – 2012-04-17 12:39:01

+1

一般来说,这并不容易,因为你失去了程序集的强大名称,导致你重新编译引用该程序集的任何人,可能会引起巨大的连锁反应。 – Zarat 2012-04-17 14:07:57