0

次のような機能を持つC++のDLLがあります。

LesMes.hpp

bool Sing_For_Me(CInstructment accompaniedBy, string song, string singer);

一方、私のWPFアプリでは、相互運用レイヤーを使用する予定でした。

[ DllImport( "musicals.dll", EntryPoint="Sing_For_Me", CharSet=CharSet.Ansi )]
public static extern bool SingForMe(???????, string note, string singer);

WPFコードでCInstrumentを参照するにはどうすればよいですか?

使用されている文字列の例はたくさんあるようですが、特定の事前定義されたデータ型などのみを使用できますか?

4

2 に答える 2

1

CInstructmentはどのように定義されていますか?構造体の場合は、非常に簡単にマーシャリングできます。新しい構造体を作成し、StructLayout(Sequential)を属性として適用し(System.Runtime.InteropServicesを参照)、それを相互運用機能に渡します。そして、なぜブール値のリターンタイプIntPtrを持っているのですか?

http://www.developerfusion.com/article/84519/mastering-structs-in-c/でさらに多くの情報を見つけることもでき ます

http://blogs.msdn.com/b/dsvc/archive/2009/02/18/marshalling-complicated-structures-using-pinvoke.aspx?Redirected=true

于 2012-08-10T08:49:10.110 に答える
1

C++クラスに直接的なP/Invokeのような方法はありませんが、これがC ++\CLIが作成された理由です。

C ++ \ CLIクラスプロジェクトを作成する必要があります。そこでCInstrument.NETクラスにラップして、それをWPFで使用できます。

詳細については、このcodeprojectの記事を参照してください

ネイティブC++コードはC++\ CLIで動作し、IJWと呼ばれるものがあります(動作します)。詳細については、この記事も参照してください。

新しいプロジェクトを追加する必要があります。選ぶ:

その他の言語>VisualC++>CLR>クラスライブラリ

ここに画像の説明を入力してください

コードは次のようになります。

//native C++ CInstrument
//cinstrument.cpp
class CInstrument
{
 ..
}

//this is a CLR class
//Compatible with C#/VB.NET
//cinstrumentwrapper.cpp
ref class CInstumentWrapper
{
 private:
 CInstrument* _instrument;//delegate to the native C++ class
}
于 2012-08-10T15:13:59.320 に答える