当前位置: 首页 > 知识库问答 >
问题:

ICE:尝试添加一个同名但类型不同的本地var。[_RegisterClipboardFormat]期间

程俊力
2023-03-14

我有一个PoC可以在使用最新的Visual Studio Community 19版本16.3.2和最新发布的IKVM 8.1.7195.0的一些UWP-app中使用一些现有的Java代码库。应用程序在调试模式下构建和运行良好,但在发布模式下无法构建,出现以下错误:

MCG0004:InternalAssert Assert失败:ICE:试图添加具有相同名称但类型不同的本地var。在[_RegisterClipboardFormat]ams.oms.poc期间

RegisterClipboardFormat是IKVM的一部分:

@DllImportAttribute.Annotation(value = "user32.dll", EntryPoint = "RegisterClipboardFormat")
private native static int _RegisterClipboardFormat(String format);

@cli.System.Security.SecuritySafeCriticalAttribute.Annotation
private static int RegisterClipboardFormat(String format)
{
    return _RegisterClipboardFormat(format);
}

https://github.com/ikvm-revived/ikvm/blob/master/openjdk/sun/awt/ikvmdatatransferer.java#L95

我想知道的是错误消息指的是哪个局部变量?可能是隐式添加的内容,或者可能与Java中的String和C#中的String有关?OTOH该文件明确命名为.java

一般情况下没有发现太多关于错误消息的信息,只有以下两个链接似乎比较有趣:

名称相同但类型不同的变量为什么C#不允许我在不同的作用域中使用相同的变量名?

所以我现在甚至不确定消息来自哪里,直接来自Visual Studio/C#还是在构建发布模式期间运行代码时的IKVM。不过,我强烈怀疑这个错误来自Visual Studio/C#。

搜索函数本身也没有什么帮助:

https://sourceforge.net/p/ikvm/bugs/225/

其他人似乎也有同样的问题,因为CN1只是在IKVM的分叉中完全禁用了该代码:

//@DllImportAttribute.Annotation(value = "user32.dll", EntryPoint = "RegisterClipboardFormat")
//private native static int _RegisterClipboardFormat(String format);

@cli.System.Security.SecuritySafeCriticalAttribute.Annotation
private static int RegisterClipboardFormat(String format)
{
    throw new Error("Not implemented");
    //return _RegisterClipboardFormat(format);
}

https://github.com/ams-ts-ikvm/cn1-ikvm-uwp/blob/master/openjdk/sun/awt/ikvmdatatransferer.java#L95

有什么想法吗?谢谢!

共有1个答案

濮阳和泰
2023-03-14

通过完全不更改任何代码,似乎有一种解决方法:如果在生成中使用.NET本机工具箱,则发布版本的设置包含一个复选框,默认情况下启用该工具箱。通过禁用,生成成功而没有任何代码更改,并且与再次调试生成一样快。在改变这一点之前,发行版构建也花费了更长的时间。

我不知道这对于实际调用本机代码意味着什么,如果它失败或没有,因为我的应用程序不使用那些。我猜它会失败,这取决于它是否在调试中工作。此外,我不确定Windows商店是否接受这样一个修改过的版本构建,但由于UWP-app并不强制使用本机代码,我猜事情很有可能会成功。

 类似资料:
  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文

  • 但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会

  • 问题内容: 我有一个Animal类和一个名为AnimalExtension的Animal扩展。 这两个类之间的唯一区别是AnimalExtension还有另一个实例变量叫做animalId。Animal没有此实例变量。 我也有自己的数据类型,想要对XML进行封送处理。此数据类型称为AnimalList。在AnimalList内,有一个Animals列表作为实例变量。 animalList可以包含A

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 我想实现一个功能,其中请求映射到正确的对象。是否有一种方法(除了自定义反序列化器)可以将请求按类型/基数映射到适当的对象?任何见解都将不胜感激!

  • 之前写过一遍博客,记录当时的一个手头的工作,使用PortableBasemapServer 和 terrabuilder 制作MPT,最近想试一试能不能将PBS发布的服务添加到Cesium三维球上,遇到的问题以及解决过程记录如下: 创建本地服务并发布,参考博客使用PortableBasemapServer 和 terrabuilder 制作MPT ,不再赘述 这里我发布的地址为: ArcGis R