C# が C++ DLL を呼び出す手順と、発生した文字化けについて説明します。

C++ DLL ダイナミック ライブラリ Lib_LR.dll:

関数宣言:
DLL_API_LR void GetAuthInfo(char* strCode);

関数定義:

2 つの入力パラメータ、2 つの出力パラメータ

void GetAuthInfo(int inPrama1, char *inParam2, int outParam1, char *outParam2)
{     char buff[2048];     memset(buff, 0, 2048);     std::ifstream inFile("license.lr", std::ios::binary);     if (inFile.fail())     {         戻り値;     }     else     {         inFile.read(buff, sizeof(temp));         inFile.close();     memcpy     (outParam2, buff, outParam2.length());












    文字列strCode=outParam2;

    outParam1=strCode.length();
}

C# 呼び出しプロセス:

関数リファレンス:

[DllImport("Lib_LR.dll", EntryPoint = "GetAuthInfo", CallingConvention = CallingConvention.Cdecl)]
public static extern void GetAuthInfo(ref int InParam1, string nInPrama2, StringBuilder strCode);

関数呼び出し:

int inParam1=0;

int outParam1=0;

文字列 inParam2="テスト";

StringBuilder outParam2= 新しい StringBuilder(1024);

//注: 関数を呼び出すときは、int 型のエクスポート パラメーターで ref を追加し、エクスポート文字列パラメーターで StringBuilder 型を宣言する必要があります。

GetAuthInfo(inParam1、inParam2、ref outParam1、outParam2);

発生した問題:

1. プラットフォームの不一致:

C# プロジェクトは、.net core に基づいた webapi プロジェクトです。デフォルトのコンパイル プラットフォームは任意の CPU ですが、C++ DLL プロジェクトのデフォルト プラットフォームは x86 です。一致する問題があります。次の方法で問題を解決できます。C++ DLL および C# プロジェクトをコンパイルするときに x86 または x64 を選択します (オペレーティング システムが 64 ビットであることが前提です)。

2. コード化けの問題:

GetAuthInfo 関数を呼び出すと取得される strCode が文字化けしてしまうため、インターネット上で解決策として関数のパラメータ宣言メソッド public static extern voidGetAuthInfo([MarshalAs(UnmanagedType.LPStr)] StringBuilder strCode) を変更するという方法が紹介されています。しかし、この方法を試してみましたが、うまくいきませんでした。最後に、この問題は DLL ソース コードを変更することで解決されます: GetAuthInfo 関数の最後に outParam2[strCode.length()] = '\0' を追加します。このコード行は、文字列配列の最後にターミネータを追加します。 。

おすすめ

転載: blog.csdn.net/landeli2/article/details/127162399