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' を追加します。このコード行は、文字列配列の最後にターミネータを追加します。 。