首页 > 解决方案 > 将字符串作为 UnmanagedCallersOnly 本机方法的 blittable 类型传递

问题描述

尝试使用 UnmanagedCallersOnly 属性,但我被困在结构中的一些字符串字段上。是否可以对这种可与新的 UnmanagedCallersOnly 属性一起使用的结构进行建模?

C++结构:

struct PluginInfo {
        int     nStructSize;   
        int     nType;         
        int     nVersion;      
        char    szName[ 64 ];  
        char    szVendor[ 64 ];
};

我在将 szName 和 szVendor 转换为 c# 时遇到了困难。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PluginInfo
{
    public int StructSize;

    [MarshalAs(UnmanagedType.I4)]
    public PluginType Type; // PluginType is an enumeration

    public int Version;

    [MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] //[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 64)]
    public string Name;

    [MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] //[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 64)]
    public string Vendor;
}


public class Plugin
{
    [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })]
    public static void GetPluginInfo(ref PluginInfo pluginInfo)
    {

        pluginInfo.Name = "myPluginName";
        pluginInfo.Vendor = "myVendorName";
        pluginInfo.Type = PluginType.Data;
        pluginInfo.StructSize = Marshal.SizeOf((PluginInfo)pluginInfo);

    }
}

错误是“不能将 'PluginInfo' 用作属性为 'UnmanagedCallersOnly' 的方法的参数类型”

标签: c#c#-5.0

解决方案


推荐阅读