【发布时间】: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