我通过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:找不到类型System.ApplicationException在CommonLanguageRuntimeLibrary模块中。
我已阅读System.ApplicationException
在.Net中为UWP折旧,而您应该只使用System.Exception
我不知道如何解决和/或纠正这个问题,因为它来自图书馆,而不是我自己的代码。
提前致谢。
答案 0 :(得分:1)
我们的IKVM端口并非完全交钥匙。 IKVM是使用.Net 2.0编译的,并且使用需要包含在使用它的UWP项目中的接口来计算一些事物(例如反射内容,某些日期内容,线程等等)。
如果您还没有实现这些接口,或者您正在使用我们不需要CN1的代码路径,那么您可能正在使用.Net 2.0类的JDK或IKVM运行时的部分内容(例如这个例外)。
目前,您的UWP项目中只需要实现两个接口:
您可以在CN1端口看到它们的初始化方式here
以下是RuntimeReflectionHelper和NativeThreadHelper
的实施方案在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任务的类预处理器项目,用于执行实际的预处理。
正如我之前所说,如果你在已经开辟的小径之外探索,预计会遇到困难。