こんにちは、
私は現在、.Netアプリケーションで再利用する必要がある機能である古い.dllと格闘しています。これまで、boolなどを返す基本/簡単な関数/メソッドをインポートするようになりましたが、実際には期待しているものもあります(またはreturn).dll内で宣言されている型。
これをどのように処理しますか?.net環境でそのタイプをマップ/作成するにはどうすればよいですか?それは可能ですか?
乾杯と感謝、-Jörg
「タイプ」とは、構造体を意味すると思います。そうでない場合は、メモリ内の構造体をタイプにマップする方法を見つける必要があります。
.NETアプリケーションで同じ構造体を作成し、StructLayout属性(LayoutKind.Sequential最も一般的)でマークする必要があります。次に、構造体への参照を渡すことができるはずです。
MSDNのPlatformInvokeチュートリアルも非常に役立ちます。
私の理解では、通常、いくつかの[StructLayout]オプション(シーケンシャルまたは明示的)を使用して、期待されるデータレイアウトを反映する構造体を.NETコードで作成し、その構造体をPInvoke境界を越えて(つまり、インポートされたAPIで)渡します。
これがあなたの望むものかどうかはわかりませんが、私はそれを撃ちます!
アプリケーションの1つ(ASP.NET)でdelphi dllを使用し、ラッパーを作成する必要がありました。winformsの場合、ラッパーDLLを作成する必要はありませんが、メソッドをマップする必要があります。2を貼り付けています。そのDLLのメソッドとその呼び出し方法:
#region DllImport
[DllImport("LicenseInterface.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Auto, EntryPoint = "EncodeString")]
private static extern int _EncodeString(
[MarshalAs(UnmanagedType.LPStr)] string secret,
[MarshalAs(UnmanagedType.LPWStr)] string str,
[MarshalAs(UnmanagedType.LPWStr)] StringBuilder encodedStr,
int encodedBufferSize);
[DllImport("LicenseInterface.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Auto, EntryPoint = "DecodeString")]
private static extern int _DecodeString(
[MarshalAs(UnmanagedType.LPStr)] string secret,
[MarshalAs(UnmanagedType.LPWStr)] string str,
[MarshalAs(UnmanagedType.LPWStr)] StringBuilder decodedStr,
int decodedBufferSize);
#endregion
public static int EncodeString(string str, ref string encodedStr)
{
StringBuilder _encodedString = new StringBuilder(2000);
int ret = _EncodeString("aYs6aL9b8722XXe43", str, _encodedString, _encodedString.Capacity);
encodedStr = _encodedString.ToString();
return ret;
}
public static int DecodeString(string str, ref string decodedStr)
{
StringBuilder _decodedString = new StringBuilder(2000);
int ret = _DecodeString("aYs6aL9b8722XXe43", str, _decodedString, _decodedString.Capacity);
decodedStr = _decodedString.ToString();
return ret;
}
public License()
{
// code...
License.DecodeKey(moduleKey, ref serial, ref moduleId, ref expirationDate, ref userData);
// more code...
}