0

我有一个 C++ 中的 DLL,其功能如下:

莱斯梅斯.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

C++ 类没有任何直接的 P/Invoke 方式,但这就是创建 C++\CLI 的原因。

您应该创建一个 C++\CLI 类项目,在那里您可以包装CInstrument成一个 .NET 类,然后在 WPF 中使用它。

有关更多信息,请参阅此codeproject 文章

本机 C++ 代码只适用于 C++\CLI,有一种叫做 IJW 的东西(它可以正常工作)。另请参阅这篇文章了解更多信息

您需要添加一个新项目。选择:

其他语言 > Visual C++ > 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 回答
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 回答