代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

如何摆脱vvv3.1d中的非托管代码和envy

  •  1
  • polygenelubricants  · 技术社区  · 16 年前

    我有一个旧的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应用程序会导致其初始化块运行,并且许多设置都会重置为默认值-字体和字体大小、窗口颜色、用户界面设置…而且似乎没有任何方法可以将设置保存到一个文件中,稍后再加载它们,或者只是查看所有设置是什么(官方设置菜单不会显示所有内容,或者我们有一个经过大幅调整的图像…从零开始重新构建它。但这是一个完全不同的问题。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Alan Knight    16 年前

    好吧,通常的建议是,您应该能够通过从存储库加载代码来从头构建开发映像。但是如果你有了它,那么答案很简单,只需丢弃图像并重新加载即可。我想已经足够长了,我已经失去了所有关于如何处理内部结构以使其恢复的知识,而且听起来你已经尝试了很多事情。因此,尽管这可能会很痛苦,但从存储库中加载东西来重新构建开发映像的方法似乎是您最好的选择。可能并没有那么可怕,可能只是对图像状态有一些依赖性,或者需要执行一些特殊的doit。

    您可能还需要根据正在使用的图像中的内容验证存储库中的内容。如果加载了非托管代码,然后有人修改并保存了它,我不清楚它是否会被保存到嫉妒中。因此,您可能希望审计所有非托管代码,如果它被更改了,请将其保存到存储库版本。

    对不起,我没有更好的答案。