【问题标题】:What is the difference in Marshaling between Windows and Linux for .NET Core?.NET Core 的 Windows 和 Linux 之间的编组有什么区别?
【发布时间】:2019-09-24 14:27:11
【问题描述】:

我正在尝试将现有库迁移到 .NET Core 以便能够在 Linux 下运行它。

在 Linux 中使用库时,运行时抛出 System.ArgumentException:

ConsoleApp6.dll 中出现“System.ArgumentException”类型的未处理异常:“类型“ConsoleApp6.MyStruct”不能作为非托管结构封送;无法计算出有意义的大小或偏移量。'

堆栈跟踪: 在 System.Runtime.InteropServices.Marshal.OffsetOfHelper(IRuntimeFieldInfo f) 在 C:\Users\user\source\repos\ConsoleApp6\ConsoleApp6\Program.cs:line 10 中的 ConsoleApp6.Program.Main(String[] args) 处

在 Windows 中,它按预期工作。 这是一个演示问题的简单控制台应用程序:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine((Int32) Marshal.OffsetOf<MyStruct>("buffer"));
            Console.ReadLine();
        }
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
    public struct MyStruct
    {

        public Int16 number;

        public byte[] buffer;
    }
}

这是 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.7.12" />
  </ItemGroup>

</Project>

我希望在 Windows 和 Linux 中输出为 4,但在 Linux 中它会引发上述异常。

【问题讨论】:

  • 你在 .NET Core 3 中试过了吗?
  • @GeorgeStocker 感谢您的建议。刚刚更新到 .NET Core 3,但问题仍然存在。

标签: c# linux .net-core marshalling


【解决方案1】:

在.NET Core中,不能使用OffsetOf&lt;T&gt;per the Docs

OffsetOf(Type, String)
返回托管类的非托管形式的字段偏移量。

OffsetOf&lt;T&gt;(String) [.NET Framework 4.5.1 及更高版本支持]

返回指定托管类的非托管形式的字段偏移量。

为了让您的代码在 Linux 上运行,您需要改用 OffsetOf(Type, String) 重载。

Console.WriteLine((Int32) Marshal.OffsetOf(typeof(MyStruct),"buffer"));

我已经深入挖掘了CLR source code;并且没有明显的理由说明您的代码不应该在 Linux 上运行。它的定义特征是Marshalable,我可以看到,它是否是一个接口。

我要深入挖掘——我在vm 文件夹中看到了源代码;但我也希望看到每个目标环境的实现源代码,但我没有看到。

【讨论】:

猜你喜欢
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 2013-07-20
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多