2011-06-27 16 views
0

のC#の問題は、私はこのエラーにネイティブC++のdll /メモリ

追加情報を持っている:読み取りまたは書き込み保護されているメモリをしようとしました。これはしばしば、他のメモリが壊れていることを示します。

あなたはその理由を知っていますか?

ネイティブC++

extern "C" void __declspec(dllexport) Mafonc(string nom); 

void __declspec(dllexport) Mafonc(string nom) 
{ 
    string tom = nom; 
} 

C#の

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

using System.Runtime.InteropServices; 
using System.Security; 

namespace TradeInterface 
{ 
    static class Program 
    { 
     [DllImport("TradeEngine.dll", CharSet = CharSet.Ansi, 
      CallingConvention = CallingConvention.StdCall, 
      ExactSpelling = true), 
     SuppressUnmanagedCodeSecurity] 
     public static extern void Mafonc(string nom); 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      Mafonc("E:\\DossierProjet"); 

      Application.Run(new Form1()); 
     } 
    } 
} 
+0

アンマネージDLLのstringの定義は何ですか?私が推測しているように文字ポインタであれば、ポインタをコピーして後で使用することはできませんが、文字列自体(strcpyなど)をコピーする必要があります。 –

+0

あなたの言っていることを理解できません。私のC++コードでは、文字列はString.hから来る実際の文字列です。 – Nazka

答えて

3

私のC++コードでは、文字列はString.hからの実際の文字列です。

<string>からの<string.h>ヘッダーに "string" というタイプの、唯一のstd ::文字列はありません。 pinvoke marshallerはC++オブジェクトを作成できません。文字列変換は非可逆であることを

[DllImport("TradeEngine.dll", CallingConvention = CallingConvention.Cdecl)] 
    public static extern void Mafonc(string nom); 

注:

extern "C" __declspec(dllexport) 
void Mafonc(const char* nom) 
{ 
    std::string tom(nom); 
} 

C#で、この宣言が必要です:あなたは、Cの文字列を使用する必要があります。 const wchar_t *とstd :: wstringを使用すると、それを避けることができます。

+1

文字列を整列するときは、あなたはMarshalAs属性を使用したいと思っています。 –

+0

ありがとう、それは今の仕事です。私はアプリケーションをビルドするためにどうやって少しの文字列に多くの問題がありますか?Grrr。:(プロキシC++/CLI dllをネイティブコードと – Nazka

+0

C++/CLI DLLを介した通信は、データをマーシャリングする必要があるため、必ずしも高速であるとは限りません。マーシャリングは一般的にs少し遅い=>可能であれば、「チャット」インターフェースよりむしろ「チャンク」でなければならない。つまり、データの少ない多数のコールではなく、大量のデータを持つコールがほとんどない。 –

2

にextern "C" のボイド__declspec(のdllexport):私は

マイコード...本当に立ち往生していますマフォン(文字列名義);

は確かに、私は正確にどのようにextern "C"作品を100%アップしないんだけど、私はあなたがC++タイプでそれを呼び出すことが許されていないかなり確信しています。私はこれがstd::stringだと仮定しますが、あなたはそれに名前空間の資格を付けませんでした。

私は非常にです。確かに、あなたがstd :: stringを使用することができたとしても、C#はstd::stringを通過しません。 .NETでは、文字列は異なる種類のオブジェクトです。したがって、C++が理解できる型への変換を行うために、特別なマーシャリングコードが必要になります。

「C++」というラベルは、実際にはC++/CLIアプリケーションですか?それは違うものだから。

+0

私のC++ dllはアンマネージ/ネイティブC++のDLLです。 extern 'C'がなくても私は同じ問題を抱えています。私は何をする必要がありますか? – Nazka

+1

@Nazka:マネージド実行可能ファイルからネイティブDLLに文字列を送信する方法を学ぶ必要があります。 C++クラスを使用したネイティブDLLを使用しないことを保証します。おそらく 'char *'や 'TCHAR *'を取るでしょう。 –

1

ypuはC++で文字列を取り込むため、StringBuilderをパラメータとして渡す必要があります。つまり、これで試してみてください。

[DllImport("TradeEngine.dll", CharSet = CharSet.Ansi, 
      CallingConvention = CallingConvention.StdCall, 
      ExactSpelling = true), 
     SuppressUnmanagedCodeSecurity] 
     public static extern void Mafonc(StringBuilder nom); 

を次にあなたが呼び出し規約が正しいことを確認していますか? CallingConvention.Cdeclではない?

+0

そして私はMafonc(「E:\ DossierProjet」)をどのように書いたのですか?最後に私は2つのエラーメッセージがあるので、 "最善のオーバーロードされたメソッドのfor'TradeIn ...にはいくつかの無効な引数があります"と "文字列 'から" System.Text.StringBuilder "に変換できません。 – Nazka

+0

あなたはC#コードを変更するには、関数を呼び出す前にStringBuilderのインスタンスを作成し、関数に渡してからToStringメソッドを使用して必要な文字列を返すようにしてください。 –

1

C++ std :: stringをマーシャリングすることはできません。整列化できる型については、marshalling stringsおよびUnmanagedTypeを参照してください。したがって、UnmanagedType.LPStrまたはUnmanagedType.LPWStrとしてマーシャリングし、アンマネージDLLを変更する必要があります。さらに、呼び出し規約はおそらくCdeclです。一緒にこれを置く:

void __declspec(dllexport) Mafonc(LPSTR nom) 
{ 
    // Do something with nom 
} 

と、次の

[DllImport(
    "TradeEngine.dll", 
    CharSet = CharSet.Ansi, 
    CallingConvention = CallingConvention.Cdecl, 
    ExactSpelling = true), 
    SuppressUnmanagedCodeSecurity] 
public static extern void Mafonc([MarshalAs(UnmanagedType.LPStr)]string nom); 
+0

アップ私はこれを持っています: "DLL 'TradeEngine.dll'で 'Mafonc'というエントリポイントを見つけることができません。 – Nazka

+0

もちろん、extern "C"部分だけでなく、メソッドを使用するC#コードも必要です。私はちょうど変更が必要な部分を書いた。 –

0

てみてください、あなたのネイティブメソッドがある

[DllImport("TradeEngine.dll",CallingConvention = CallingConvention.Cdecl)] 
      private static extern void Mafonc(StringBuilder data); 

を、

extern "C" _declspec(dllexport) void Mafonc(std::string data) 
{ 
    string xyz=data; 

} 

IJW

関連する問題