2012-07-23 47 views
0

我在Monodroid中有一个混淆的应用程序,我的问题是,包含在apk中的mscorlib程序集没有实现方法System.String.Intern()和我的应用程序不工作。在mscorlib.dll中包含的Missing方法

我的混淆器调用这个方法来混淆字符串,我得到一个MissingMethodException。 apk中包含的程序集中不存在此方法,但奇怪的是它存在于myproject/obj/release/assemblies/mscorlib.dll中

这些文件有很大不同。如果我把apk文件myproject/obj/release/assemblies/mscorlib.dll放入apk中,它可以工作,但是这个解决方案是一个糟糕的解决方案,因为应用程序在其他点导致TypeLoadException由于dll的更改而失败。

谁能告诉我为什么monodroid使用mscorlib简化文件和替代解决方案?

谢谢。

+0

你如何使用String.Intern()'?这似乎很奇怪,它会被删除,除非你通过反射来调用它(因此链接器不会“看到”你的使用)。 – jonp 2012-07-26 17:21:48

+0

我在Reflector中看到,包含在apk中的程序集mscorlib.dll不使用String.Intern()方法。似乎每个.net混淆器都使用此调用来混淆字符串。你可以验证一些单声道apk是否包含这种方法?谢谢 – daniherculano 2012-07-26 17:29:08

回答

1

谁能告诉我为什么monodroid使用mscorlib简化文件和替代解决方案?

较小的文件用于减少应用程序大小linking the assemblies。链接可能很脆弱,因为链接器不会跟踪运行时行为。例如,使用Type.GetType("Foo")将不保留类型Foo,因此链接器可能会删除它,如果没有另外引用。

obj\Release\assemblies\mscorlib.dll是源程序集。 obj\Release\android/assets/mscorlib.dll是链接(较小)的程序集,它包含在.apk中。

如果您的混淆器直接使用String.Intern(),这可能表示链接器中存在错误。但是,如果您的混淆器使用反射(例如Type.GetMethod()),那么这将是预期的行为。要修复它,您明确使用String.Intern()within a falseflag block,以便保留该方法。

+0

你是对的。如果我明确使用它,链接程序集包含此方法并且它可以工作。很有帮助。 谢谢。 – daniherculano 2012-07-27 08:09:57