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

我通过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 。

从我所读到的内容, System.ApplicationException在.Net中为UWP折旧,而你应该只使用System.Exception

我不知道如何解决和/或纠正这个问题,因为它来自一个库,而不是我自己的代码。

提前致谢。

我们的IKVM端口不是很好的交钥匙。 IKVM是使用.Net 2.0编译的,并且使用需要包含在使用它的UWP项目中的接口来排除一些事物(例如reflection内容,某些日期事物,线程等等)。

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

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

  1. RuntimeReflectionHelper。
  2. NativeThreadHelper

你可以在CN1端口看到它们如何在这里初始化

以下是RuntimeReflectionHelper和NativeThreadHelper的实现

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

即便如此,您可能会遇到问题。 IKVM的这个端口正沿着CN1端口发展,它实际上只针对我们的用例进行了测试。 如果我们不为CN1要求它们,则可能未实现某些常用方法。

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

  1. 如果您希望项目中的IKVM编译代码相互引用,则它们必须是单个.dll文件的一部分。 例如,如果将lib1.jar和lib2.jar两个库编译为lib1.dll和lib2.dll,则lib1中的代码不能引用lib2中的类,反之亦然。 在CN1中,我将所有.class文件捆绑到单个.jar中,然后通过IKVM运行它,这对我们来说不是问题(因此我没有花太多时间来修复它)。

  2. 如果你的目标是发布到Windows商店,他们的DotNetNative工具链中当前存在一个错误,导致它阻塞包含try / catch块的同步方法。 这可能会在未来的版本中由Microsoft修复,但我通过在所有类上运行预转换来将所有这些方法转换为其本机工具链可接受的forms。 这是我们应用此预处理的ANT任务的一部分。 这是ANT任务的类预处理器项目,用于执行实际的预处理。

正如我之前所说的那样,如果你在已经开火的小径之外探索,那么预计会遇到困难。