Smalltalk 如何摆脱VW 3.1d和ENVY中的非托管代码

Smalltalk 如何摆脱VW 3.1d和ENVY中的非托管代码,smalltalk,visualworks,Smalltalk,Visualworks,我有一个旧的VW3/ENVY图像,其中一个包作为非托管代码加载(正是这种情况所警告的)。不幸的是,这个问题发生在很久以前,现在在不加载包裹的情况下“返回”图像已经太晚了 显然,有一种方法可以解决这个问题(我们有一个开发映像已经解决了这个问题,并且有一些普通的配置映射包含与非托管包完全相同的代码,但它们无法加载),但确切的方法早已被遗忘(将特定的dev映像作为新运行时映像的基础存在一些问题,因此我需要了解如何再次执行该操作) 理论上,应该可以从配置映射中删除包并重新加载代码。在实践中,所有常规方法

我有一个旧的VW3/ENVY图像,其中一个包作为非托管代码加载(正是这种情况所警告的)。不幸的是,这个问题发生在很久以前,现在在不加载包裹的情况下“返回”图像已经太晚了

显然,有一种方法可以解决这个问题(我们有一个开发映像已经解决了这个问题,并且有一些普通的配置映射包含与非托管包完全相同的代码,但它们无法加载),但确切的方法早已被遗忘(将特定的dev映像作为新运行时映像的基础存在一些问题,因此我需要了解如何再次执行该操作)

理论上,应该可以从配置映射中删除包并重新加载代码。在实践中,所有常规方法(使用ParcelBrowser或直接调用UnmanagedCode>>remove)都失败。我甚至尝试从方法字典中手动删除有问题的选择器,但超过了某一点(包括调用#primebe:)整个映像完全挂起(我甚至无法进入调试器)。我开始对类和方法的实例进行黑客攻击,希望能诱使嫉妒认为这些特定方法是正常版本的代码,但还没有成功

是否有任何smalltalk/嫉妒大师仍然记得足够多的大众3,为我提供任何指针

状态更新 经过一周的努力,我终于解决了这个问题,至少部分解决了,所以万一有人感兴趣

首先,我必须修复umnanaged代码的文件指针(否则,所有试图接触这些方法的东西都会抛出异常)。这看起来像是嫉妒扩展包,因此,理论上,所有整数文件指针在加载时都会更改为嫉妒的
void
filepointer,但在我的情况下,我必须手动执行(包裹为它定义的所有选择器提供枚举)。另一种方法是调整
filePointer
代码,但这不容易在需要它的每个图像上自动完成

然后,可以丢弃包裹,这会删除包裹信息,但保留代码。官方的“丢弃”机制需要有一个有效的更改文件(envy不使用该文件,因此必须手动设置,然后重置)和包裹源(幸运的是,我们有)

为了能够对方法进行任何更改(手动或通过从ENVY加载应用程序或类),它们需要摆脱非托管状态(我还去掉了所有在非托管代码sich中作为时间戳的类的引用,并删除了对废弃包裹的引用)。实际上,我从老板那里得到了一些关于如何达到这一点的信息,但直到我自己几乎弄明白了这一点,我才能够理解这些说明

这最终允许我加载并重新加载包含这些类的所有应用程序。理论上,在实践中,每当我尝试加载新版本的应用程序(以前包含在包中的代码)时,图像仍然完全挂起

结果表明,崩溃与未被管理的代码完全无关,而是与所讨论的包修改了
InputState>>进程:
,由于缺少和/或未初始化的类变量而导致异常有关(直到新的
进程:
方法就位后,
InputState>>initialize
方法才被调用)。我必须修改
通知程序
类,将所有异常转储到文件中,以了解发生了什么。将类变量添加到类的源中(而不是通过反射添加),通过
toBeLoadedCode
挂起输入处理线程,然后在
loaded
方法中再次启动它,并创建应用程序的新版本,甚至解决了这个问题


现在,理论上一切都正常了。实际上,它仍然无法使用,因为重新加载Windows系统或VisualworksBase应用程序会导致其初始化块运行,并且许多设置都会重置为默认值—字体和字体大小、窗口颜色、UI设置……而且似乎没有任何方法可以只保存设置gs加载到一个文件,稍后再加载,或者只是看看所有的设置是什么(要么官方的设置菜单没有显示所有内容,要么我们有一个经过大量调整的图像…从头开始重建就需要这么多)。但这是一个完全不同的问题。

好吧,通常的建议是,通过从存储库加载代码,您应该能够从头开始重建开发映像。但如果您有,那么答案很简单,只需丢弃该映像并重新加载即可。我想,我已经失去了足够长的时间了呃,我知道如何搞乱内部结构来取回它,听起来你已经尝试了很多东西。因此,尽管这可能会很痛苦,但通过从存储库加载东西来找到重建开发形象的方法听起来可能是你最好的选择。这可能没那么可怕,只是图像状态可能有一些依赖项,或者需要执行的特殊doit

您可能还需要对照正在使用的映像中的内容验证存储库中的内容。如果加载了非托管代码,然后有人修改并保存了它,我不清楚它是否会保存到ENVICE。因此,您可能希望审核所有非托管代码,如果它已被更改,请保存t转换到存储库版本


很抱歉,我没有更好的答案。

通常情况下,建议您通过从repositor加载代码,从头开始重建开发映像