我有一个旧的VW3/ENVY图像,包裹被加载为非托管代码(正是Mastering ENVY/DEVELOPER警告的情况)。不幸的是,这个问题很久以前就发生了,如果没有加载包裹,只是“返回”一个图像就太迟了。如何摆脱VW 3.1d和ENVY的非托管代码
显然,有一种方法可以解决这个问题(我们有一个开发图像解决了这个问题,并且有正常的配置图包含与非托管包完全相同的代码,但它们无法加载) ,但确切的方式早已被遗忘了(并且将特定的开发映像作为新运行时映像的基础存在一些问题,所以我需要了解如何再次执行此操作)。
理论上,应该可以删除地块并从配置地图重新加载代码。实际上,所有常规方式(使用ParcelBrowser或直接调用UnmanagedCode >> remove)都会失败。我甚至尝试从方法字典中手动删除有问题的选择器,但是过了某个时间点(涉及#primBecome的调用:)整个图像完全挂起(我甚至无法进入调试器)。我开始黑客攻击类和方法的实例,希望我会欺骗ENVY认为这些特定的方法是普通的版本化代码,但没有任何成功。
有没有任何一个小叮当/嫉妒的大师,还记得足够的大众3给我提供任何指针?
状态更新 试图解决我终于成功了问题,至少部分,所以如果任何人的兴趣过了一个星期......
首先,我不得不修复文件指针的umnanaged代码(否则,所有试图触及方法的东西都会抛出异常)。它看起来像ENVY扩展了Parcel,所以在理论上,所有整型文件指针在加载时都会更改为ENVY的void
filepointer,但在我的情况下,我必须手动执行它(Parcel为它定义的所有选择器提供枚举)。另一种方法是调整filePointer
代码,但不能在需要的每个图像上自动完成。
然后,包裹可以被丢弃,这会丢弃包裹信息,但保留代码。官方的“放弃”机制需要有一个有效的更改文件(嫉妒不用,所以必须手动设置,之后重置)和包裹来源(我们很幸运)。
为了能够对方法进行任何更改(手动或通过从ENVY加载应用程序或类),他们需要摆脱其非托管状态。这可以通过手动调整TheClass>>applicationAssocs
(我也摆脱了UnmanagedCode sich中的所有类的引用作为时间戳,并删除了对丢弃包的引用)。实际上我有一些关于如何从我的老板那里得到的信息,但是直到我几乎自己想出来之前,我一直无法理解这些说明。
这终于让我加载并重新载入所有包含类的应用程序。理论上。实际上,每当我尝试加载应用程序的更新版本(包含以前在包裹中的代码)时,图像仍然完全挂起。
原来的崩溃有绝对无关的代码是不受管理,但与事实有关的包裹修饰InputState>>process:
,它导致异常,原因是缺少和/或初始化类变量(在新的process:
方法到位之后才调用InputState>>initialize
方法)。我必须修改Notifier
类才能将所有异常转储到文件以了解发生了什么。将类变量添加到类的源代码中(而不是通过反射来添加它),通过toBeLoadedCode
挂起输入处理线程并在loaded
方法中再次启动并创建新版本的应用程序即使解决了此问题。
现在一切正常,在理论上。在实际中,它仍然是不可用的,因为重新加载WindowSystem或VisualworksBase应用程序会导致它们的初始化块运行,并且大量设置被重置为它们的默认设置 - 字体和字体大小,窗口颜色,UI设置...并且没有似乎有任何方法可以将设置保存到文件并稍后加载,或者只是查看所有设置是什么(官方设置菜单不显示所有内容,或者我们有一个严重调整的图像...非常重要从头开始)。但这是一个完全不同的问题。
+1哇,有一段时间没有看到任何带有小标签的问题。 – karim79 2009-09-07 16:13:20