我通过CodenameOne的IKVM版本运行了一个第三方Android库,并成功导入了输出.dll作为对我在Visual Studio中的UWP应用的引用。尝试编译项目时,我得到一个构建错误:

(从“错误列表”窗口中)


  在模块CommonLanguageRuntimeLibrary中找不到类型System.ApplicationException


(从“输出”窗口)


  程序文件(x86)\ MSBuild \ Microsoft \ WindowsXaml \ v14.0 \ 8.2 \ Microsoft.Windows.UI.Xaml.Common.targets(352,5):Xaml内部错误错误WMC9999:在模块CommonLanguageRuntimeLibrary中找不到类型System.ApplicationException 。


根据我的阅读,在UWP的.Net中已贬值,相反,您应该只使用System.ApplicationException

我不知道如何解决和/或更正此错误,因为它来自库而不是我自己的代码。

提前致谢。

最佳答案

我们的IKVM端口还不太完善。 IKVM是使用.Net 2.0进行编译的,并且某些东西(例如反射东西,一些日期东西,线程等)是通过使用接口(它必须包含在使用它的UWP项目中)进行分解的。

如果您尚未实现这些接口,或者正在使用CN1不需要的代码路径,那么您可能正在着手使用.Net 2.0类的JDK或IKVM运行时的某些部分(例如,此异常)。

当前,您的UWP项目中仅需要实现两个接口:


RuntimeReflectionHelper。
NativeThreadHelper


您可以在CN1端口中看到它们如何初始化here

这是RuntimeReflectionHelperNativeThreadHelper的实现

在UWP项目中实现这些功能可以避免IKVM是为.Net 2.0编译的,因此这些实现可以直接使用UWP API。

即使这样,您也可能会遇到问题。 IKVM的该端口沿CN1端口发展,并且实际上仅针对我们的用例进行了测试。如果我们对CN1不需要某些常用方法,则可能无法实现。

您应该注意的其他一些限制:


如果希望彼此引用,则项目中IKVM编译的代码必须是单个.dll文件的一部分。例如。如果将两个库lib1.jar和lib2.jar编译为lib1.dll和lib2.dll,则lib1中的代码无法引用lib2中的类,反之亦然。在CN1中,我将所有.class文件捆绑到单个.jar中,然后再通过IKVM运行,因此这对我们来说不是问题(因此,我没有花太多时间来修复它)。
如果您的目标是发布到Windows应用商店,则其DotNetNative工具链中当前存在一个错误,该错误会导致其阻塞包括try / catch块的同步方法。 Microsoft可能会在将来的版本中修复此问题,但我可以通过在所有类上运行预转换来将所有此类方法转换为其本机工具链可接受的形式来解决此问题。 Here ANT任务中应用此预处理的部分。 Here是ANT任务的类预处理程序项目,用于执行实际的预处理。


就像我之前说的,如果您在已经被大火烧过的小径之外探索,可能会遇到困难。

关于c# - 在模块CommonLanguageRuntimeLibrary中找不到类型System.ApplicationException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39683977/

10-10 23:46