-2

p/invoke を介して文字列を配信する必要があります。これは単なるファイル名で、「desc.xml」のようなものです。std::stringそれが何か他のものであるかどうかは気にしませんchar*(適切なタイプに変換できます)。署名はどのように宣言すればよいですか?

C#側では、次のようなことを期待しています:

    [DllImport("Native.dll"), SuppressUnmanagedCodeSecurity]
    public static extern void Initialize(/*TODO: how to pass string?*/);

C ++側では、次のようなものを期待しています:

__declspec(dllexport) void Initialize(char* fileName);

またはstd::string代わりにchar*

__declspec(dllexport) void Initialize(std::string& fileName);

私はそれがそのように使用されることを期待しています:

Initialize("desc.xml");

問題は、どのように正確にパラメーターを宣言する必要があるかです。

4

2 に答える 2

3
public static extern void Initialize(string filename);

また、C++ 側 ( for 、for ) にあるものと一致するようにCharSetを追加します。DllImport("Native.dll")CharSet.Ansichar*CharSet.Unicodewchar*

于 2013-08-05T12:26:42.640 に答える
2

ANSI でエンコードされたテキストを受け取りたいと仮定すると、C++ コードを次のように宣言する必要があります。

__declspec(dllexport) void Initialize(const char* fileName);

これは、 のデフォルトの呼び出し規約を使用します__cdecl。テキストは、ヌル終了配列へのポインターとして渡されますchar

C# 側では、次のように宣言します。

[DllImport("Native.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern void Initialize(string fileName);

デフォルトは ANSI であるため、文字セットを指定する必要はありません。明確にしたい場合(私の見解では悪い考えではありません)、次のように書くことができます:

[DllImport("Native.dll", CallingConvention=CallingConvention.Cdecl, 
    CharSet=CharSet.Ansi)]
public static extern void Initialize(string fileName);

C++ コードをそのままコンパイルすると、関数の名前がマングルされます。マングルされた名前を指定するには、属性のEntryPointパラメーターを使用する必要があります。別の方法として、マングリングを抑制するためDllImportに、関数のネイティブ コードの宣言をブロックにまとめることができます。extern "C"

于 2013-08-05T13:41:44.563 に答える