将字符串作为 blittable 类型传递给 UnmanagedCallersOnly 本机方法

问题描述

尝试使用 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)]
    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' 的方法的参数类型”

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)