2016-08-23 13 views
0

InnoSetupプロジェクトでC#DLLを参照しようとしています。必要なのは、1つの文字列パラメータと文字列戻り値を持つ単純な関数です。しかし、この例とさまざまな種類のマーシャリングを試しても、私は常にアクセス違反で終わります。Innoセットアップアクセス違反のC#DLL

これは私のC#クラスです:

public class NKToolbox 
{ 
    [DllExport("EncryptPassword", CallingConvention.StdCall)] 
    static string EncryptPassword([MarshalAs(UnmanagedType.LPStr)] string password) 
    { 
     File.WriteAllText(@"C:\temp\test.txt", password); 
     return password.Length.ToString(); 
    }  
} 

私はメソッドが呼び出されたとしてもどうかを確認するためにFile.WriteAllTextを置きます。しかし、いいえ。私はRobert GieseckeのUnmanagedExportsパッケージを使用します。

そしてInno Setupのコード:私が得るラインstr := EncryptPassword('sdvadfva')

function EncryptPassword(pw: WideString): WideString; 
external '[email protected]:nktoolbox.dll stdcall'; 

function InitializeSetup: Boolean; 
var 
    str: WideString; 
begin 
    str := EncryptPassword('sdvadfva'); 
    log(str); 
    result := False; 
end; 

「アドレスのアドレスにアクセス違反が......書き込み.....」私が使用していますInnoセットアップ5.5.9 Unicode。

私は他のスレッドで見つかったさまざまなマーシャルステートメントで試してみましたが、outキーワードで試してみましたが、通常stringタイプとWideStringが必要です。 Delphiコードで

答えて

2
[DllExport("EncryptPassword", CallingConvention.StdCall)] 
static string EncryptPassword([MarshalAs(UnmanagedType.LPStr)] string password) 

、これはにマップ:C#コードは、CoTaskMemAllocの呼び出しによって割り当てられた文字列を返すことも

function EncryptPassword(password: PAnsiChar): PAnsiChar; stdcall; 

注意。あなたのコードはCoTaskMemFreeを呼び出してそのバッファの割り当てを解除することが期待されます。

この関数をインポートするコードは、テキストをCOM BSTR文字列として扱います。それは事実ではない。

COM BSTRを使用すると、別名WideStringが良い考えです。しかし、C#とInnoが戻り値としてABIを想定している可能性があることに注意してください。 outパラメータを使用する方がよいでしょう。私は私の答えのように一部のInnoの何も知らない

procedure EncryptPassword(input: WideString; out output: WideString); 
    external '[email protected]:nktoolbox.dll stdcall'; 

[DllExport("EncryptPassword", CallingConvention.StdCall)] 
static void EncryptPassword(
    [MarshalAs(UnmanagedType.BStr)] 
    string input 
    [MarshalAs(UnmanagedType.BStr)] 
    out string output 
) 
{ 
    output = ...; 
}  

そして革新はそうのようになる:私はそうのようなC#のを宣言するだろうあなたの靴ではWhy can a WideString not be used as a function return value for interop?

を参照してください。推測に幾分依存している。

+0

遅くて申し訳ありませんが、私は今までそれをテストする時間がありませんでした。しかし、それは魅力のように動作します!ありがとうございました。 –

関連する問題