私は現在、アンマネージ プログラムと別の C# DLL の間で "プロキシ" として機能する C++/CLI で DLL を作成しています。呼び出しプログラムは、アンマネージ プログラムによって呼び出されるさまざまなプロシージャを実装するために、"プロキシ DLL" を必要とします。これまでのところ、問題ありません。
ただし: 関数の 1 つに次のプロトタイプがあります。
extern "C" __declspec ( dllexport ) long Execute(unsigned long command, long nInBytes, byte bInData[], long nOutBytes, long* pnUsedOutBytes, byte bOutData[])
さて、私のプロキシ DLL は、次の関数プロトタイプを提供する C# DLL を呼び出すだけです (呼び出しプログラムのドキュメントにも記載されています)。
unsafe public UInt32 Execute(UInt32 command, Int32 nInBytes, byte* pInData, Int32 nOutBytes, Int32* pnUsedOutBytes, byte* pOutData);
コンパイラは、パラメーター 5 でエラー (C2664) をスローし、にキャストできないことをpnUsedOutBytes
通知します。OK、現在は将来的に変更される可能性のある同じ実装を持っているので、スローされたエラーは理解できます (ただし、ポインター以外の長い使用はエラーをスローしませんか?)。long*
int*
long
int
実際の質問に戻ります: C# 関数を呼び出すための最適なソリューションは何ですか? (もちろん) 最善の解決策は、.NET 関数を呼び出すときに .NET 型を使用することです。だから:関数を呼び出すときに単純な型キャストを行うのは安全ですか、それともこの型キャストがうまくいかない悪い状況があるかもしれませんか?
この行を使用するとコンパイラが落ち着きますが、本当に安全ですか?
curInstance->Execute(command, nInBytes, pInData, nOutBytes, (System::Int32*)pnUsedOutBytes, pOutData);
前もって感謝します!