VB.NETアセンブリのP/Invoke宣言をC#から使用しようとすると、string
引数がref string
引数になっています。より密接に検査すると、例えば、 「VBByRefStr:アンマネージコード内の文字列を変更するには、Visual Basic .NETを有効にする値を、そしてその結果がマネージコードに反映されていVB.NET P/Invoke宣言のVBByRefStrの理解
Public Declare Unicode Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueW" (_
ByVal hKey As IntPtr, ByVal lpValueName As String) As UInteger
は私が読んMSDNオン
[DllImport(...)]public static extern uint RegDeleteValue(
IntPtr hKey, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpValueName);
にコンパイルされます。この値は、プラットフォームの呼び出しに対してのみサポートされています。これは、Visual BasicではByVal文字列の既定値です。
私はまだそれを取得しません。 VB.NETではなく、奇妙なVBByRefStr
: - なぜそれが唯一のstring lpValueName
C#で(ため Damien_The_Unbelieverが指摘したように、署名はRegDeleteValueように同じである編集pinvoke.netを参照)されましたか? VB.NETで<MarshalAs(UnmanagedType.LPWStr)>
と宣言して、ref
をC#で回避する必要がありますか?それとも悪影響がありますか?
これは大きな違いはありませんが、あなたのピンボケリンクは* different *機能です。 'RegDeleteKey'!=' RegDeleteValue'です。 advapi32内の['RegDeleteValue'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724851(v = vs.85).aspx)のPInvokeページが見つかりません –
私が 'RegDeleteValue'を見つけなかったときに私がpinvokeで' RegDeleteKey'で終わったように見えます。混乱させて申し訳ありません。しかし、主な所見は 'RegDeleteKey'でも同じです:-) –