は、だから私はこのようになりますC++で記述された機能、...なぜC#とVB.NETはchar *を暗黙的にマーシャリングするのですか? (C#で書かれた)
extern "C" __declspec(dllexport) int __stdcall SomeFunction(char *theData)
{
// stuff
}
を持っている...と私は私の現在のプロジェクトでそれを使用しています。 VBで書かれたこの機能を使用する他のプロジェクトは、このように見て、あります
Public Declare Function SomeFunction Lib "MyDLL.dll" _
Alias "[email protected]" (ByVal theData As String) As Integer
だから私はC#で同等のを書いてみましたが、文字列型を使用して、実際に私のために動作しないことが判明 - 文字列が希望私がそれを渡した同じデータで戻ってきてください。代わりに"ref string"
を使って文字列を参照渡ししようとしましたが、メモリアクセス違反がありました。
は、いくつかの掘削を行った後、私は、これはC#での正しい実装であることがわかった:
[DllImport("MyDLL.dll", EntryPoint = "[email protected]")]
public static extern int SomeFunction(StringBuilder theData);
は今、私はVB.NETやC#はかなり異なっていることを知っているが、私は常に文字列が文字列だったと仮定したと。 1つの言語がchar*
からString
に暗黙的にマーシャリングできる場合、なぜ他のクラスは別のクラスを必要としますか?
(わかりやすくするためにタイトルを編集)
JustDecompileまたは.NET Reflectorで両方のバージョンを調べるのは興味深いかもしれません。 –