2

以下に示すように、Cファイルに構造体があります

struct Parameter{
    char param1[20];
    char param2[20];
}

また、以下に示すように、この構造体をパラメーターとして受け取り、char*を別のパラメーターとして受け取るCファイルの関数

extern "C" __declspec(dllexport) void GetValue(char* opt,struct Parameter param);
void GetValue(char* opt, struct Parameter params)
{
printf("%s", params->param1);
}

マーシャリングを使用してC#アプリケーションから呼び出したい。C#で同様の構造体を作成しました

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class Parameters
{      
    public string Param1 { get; set; }     
    public string Param1 { get; set; }   
}

以下のメソッドを使用してC#で呼び出します

 [DllImport(@"C:\Test\CTestDll.dll",CallingConvention = CallingConvention.Cdecl,CharSet=CharSet.Ansi)]      
 public static extern void GetValue([MarshalAs(UnmanagedType.LPStr)]StringBuilder sbOut, [MarshalAs(UnmanagedType.LPStruct)]Parameters sbIn);

しかし、printステートメントである結果はnullを出力します。私はCプログラミングがあまり得意ではありません。親切にそれを整理するのを手伝ってください。私が間違っているのは、C関数にあるのか、C#からのマーシャリングにあるのか

4

1 に答える 1

2

違いは、C++ では構造体に生の文字が含まれているのに対し、C# ではクラスに文字列への参照が含まれていることです。MarshalAs 属性は、文字列への参照の代わりに char 配列を使用します。

unsafe static class Program
{

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Parameters
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    public String Param1;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    public String Param2;
}


[DllImport(@"CTestDll2.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void GetValue(StringBuilder sbOut, Parameters sbIn);


static void Main(string[] args)
{
    var p = new Parameters
    {
        Param1 = "abc",
        Param2 = "dfc"
    };

    var s = new StringBuilder("some text");

    GetValue(s, p);
}

}

C++:

// CTestDll.h

#pragma once

#include <stdio.h>

extern "C" __declspec(dllexport) void GetValue(char* opt, struct Parameter param);

struct Parameter{
    char param1[20];
    char param2[20];
};

void GetValue(char* opt, struct Parameter params)
{
    printf("param1: %s, param2: %s, string: %s", params.param1, params.param2, opt);
}
于 2012-07-13T13:00:08.900 に答える