我有一个旧的vw3/envy映像,其中一个包作为非托管代码加载(具体情况如下
Mastering ENVY/DEVELOPER
警告)。不幸的是,这个问题很久以前就发生了,现在“返回”图像而不加载包裹已经太迟了。
显然,有一种方法可以解决这个问题(我们有一个已经解决了这个问题的开发映像,并且有一些普通的配置映射包含与非托管包完全相同的代码,但它们无法加载),但确切的方法早就被遗忘了(并且将特定的dev映像作为新运行时映像的基础,因此我需要了解如何再次执行此操作)。
理论上,应该可以从配置图中删除包并重新加载代码。实际上,所有正常方式(使用parcelbrowser或直接调用unmanagedcode>>remove)都会失败。我甚至尝试手动从方法字典中删除有问题的选择器,但是超过了某一点(包括调用primBecome:)整个图像完全挂起(我甚至无法插入调试器)。我开始对类和方法的实例进行黑客攻击,希望我能欺骗嫉妒,让他们认为这些特定的方法是正常的版本代码,但还没有成功。
有没有一些小说家/嫉妒大师仍然记得足够多的大众3,以提供给我任何指针?
状态更新
经过一周的努力,我终于解决了这个问题,至少部分解决了,所以万一有人感兴趣…
首先,我必须修复umnanaged代码的文件指针(否则,所有试图接触方法的东西都会抛出异常)。看起来envy扩展了包,因此理论上,所有整数文件指针都改为envy
void
文件指针加载时,但在我的例子中,我必须手动执行(包为它定义的所有选择器提供枚举)。另一种方法是调整
filePointer
代码,但在需要的每个图像上,这不容易自动完成。
然后,可以丢弃包裹,这会丢弃包裹信息,但保留代码。官方的“放弃”机制需要有一个有效的更改文件(ENVY不使用该文件,因此必须手动设置,然后重置)和包源(幸运的是,我们拥有)。
为了能够对方法进行任何更改(手动或通过从envy加载应用程序或类),它们需要摆脱其非托管状态。这可以通过手动调整来完成。
TheClass>>applicationAssocs
(我还去掉了对非托管代码sich中的类作为时间戳的所有引用,并删除了对丢弃包的引用)。实际上,我从我的老板那里得到了一些关于如何做到这一点的信息,但直到我自己几乎弄明白了这些说明,我才能够理解这些说明。
这最终允许我加载和重新加载包含这些类的所有应用程序。理论上。实际上,每当我试图加载应用程序的新版本(以前包中包含代码)时,图像仍然完全挂起。
结果证明车祸是绝对的
与非托管代码无关
但事实上,问题包裹被修改了
InputState>>process:
,其中由于缺少和/或未初始化的类变量而导致异常
InputState>>initialize
直到在新的
process:
方法已经到位)。我不得不修改
Notifier
类将所有异常转储到一个文件,以查明发生了什么。将类变量添加到类源(而不是通过反射添加),通过
toBeLoadedCode
然后在
loaded
方法和创建新版本的应用程序甚至解决了这个问题。
从理论上讲,现在一切都正常了。实际上,它仍然不可用,因为重新加载WindowsSystem或VisualWorksBase应用程序会导致其初始化块运行,并且许多设置都会重置为默认值-字体和字体大小、窗口颜色、用户界面设置…而且似乎没有任何方法可以将设置保存到一个文件中,稍后再加载它们,或者只是查看所有设置是什么(官方设置菜单不会显示所有内容,或者我们有一个经过大幅调整的图像…从零开始重新构建它。但这是一个完全不同的问题。