SimpleITK Windows通用应用程序-未在发行版中内置,调试和TypeLoadException中出现奇怪行为

本文关键字:调试 TypeLoadException 内置 Windows 应用程序 SimpleITK | 更新日期: 2023-09-27 18:22:04

TL;DR版本:Could not load type 'System.Runtime.InteropServices.HandleRef,尝试在通用Windows应用程序上使用SimpleITK

所以,现在我必须用SimpleITK做一个简单的学校项目,我对新的通用Windows应用程序感兴趣。我使用的是Visual Studio 2015 Enterprise。

所以,我创建了一个示例项目,添加了对SimpleITKManaged的引用,复制&将SimpleITKNative粘贴到obj/Debug目录,并尝试做一些教程。然而,我了解到,将两种新技术混合在一起可能是个坏主意。

我使用的ITK库似乎不适用于通用Windows应用程序。将这个片段放在代码中的任何位置后,我都无法调试该方法。代码在方法开始时未达到断点。内部内容并不重要,因为SimpleITK中的任何类型都会导致代码失败。

private void TestMethod()
{//breakpoint here
    ImageFileReader reader = new ImageFileReader();
    reader.SetFileName(FileName);
    var image = reader.Execute();
}

异常似乎是在代码到达方法之前抛出的,可能是在XAML级别。我首先尝试将调用实现为ICommand,然后在代码后面实现为事件处理程序,没有任何区别。例外情况也没有太大帮助:

 Could not load type 'System.Runtime.InteropServices.HandleRef' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'.

StackTrace:也不是

at Pomwjo.Universal.MainPage.ButtonBase_OnClick(Object sender, RoutedEventArgs e)

相同的库在WPF中运行良好。我尝试了x64和x86库,但都出现了相同的问题。构建目标和库体系结构是匹配的。我使用SimpleITK C#x86包装器0.9.0,使用.NET v2.0.50727编译,使用ITK 4.7.2。我从Sourceforge预构建了它们。就在那之后,我发现了一个0.9.1版本,我下载并尝试使用它,但没有成功。

下一步是好吧,我是一个专业程序员-我会自己构建它。我将不遗余力地描述建造一个巨大的图书馆是什么,让我们说它也不起作用。

有什么想法吗,如何解决这个问题?

编辑1我刚刚意识到,如果代码无法访问,它不会抱怨。好吧,至少这是意料之中的事。但是,更奇怪的是,这个片段只有在满足条件时才会失败:

  if (new Random().Next(1, 10)%2 == 0)
       WrapperMethod(); //inside is snippet from above.
  else  return;

此外,在发布版本中构建时,我会收到以下错误:

1>C:'Program Files (x86)'MSBuild'Microsoft'.NetNative'x64'ilc'IlcInternals.targets(791,7): error : MCG0024: MCG0024:UnresolvableTypeReference Unresolvable type reference 'System.Runtime.InteropServices.HandleRef' in 'Assembly(Name=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)' found. Check the references in your build system. A reference is either missing or an assembly is missing an expected type.

SimpleITK Windows通用应用程序-未在发行版中内置,调试和TypeLoadException中出现奇怪行为

当第一次写这个问题时,在通用应用程序中不可能使用simpleITK,因为它缺少一些工作所需的类,包括System.Runtime.InteropServices.HandleRef

此外,因为所有的应用程序都是在沙盒中运行的,我的猜测(经过教育,但仍然是猜测)是,使用SimpleITK使用的原生C++代码是完全不可能的。这个链接描述了一种将本机代码导入应用程序的方法,但这需要对ITK库本身进行大量修改——这在我的项目中不是重点。