2012-08-10 74 views
0

我在C++中DLL中包含以下一个函数,:从WPF应用程序调用C++代码时变量是如何定义的?

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代码中引用CIndustration

似乎有很多正在使用的字符串的例子,你只能使用某些预先定义的数据类型或什么?

+1

AFAIK没有对类的任何信息。您应该创建一个C++ \ CLI dll项目,然后您可以将'CInstrument'封装到一个.NET类中,然后在WPF中使用它。请参阅[这篇文章的更多信息](http://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-10-minutes#A8) – gideon 2012-08-10 09:03:16

+0

真棒 - 如果你有时间,那么请随时把这个作为答案,所以我可以upvote和接受它 – Stefan 2012-08-10 10:21:27

+1

我添加了我的答案和详细说明它,这对任何人都有帮助:) – gideon 2012-08-10 15:14:38

回答

1

没有任何直接的P/Invoke的排序为C++类的方式,但是这就是为什么C++ \ CLI变得更为intormation。

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

看到这个codeproject article for more info

本地C++代码只需用C++ \ CLI的作品,还有一些所谓的IJW(它只是工作)。另见this article for more

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

其他语言>的Visual C++> CLR>类库

enter image description here

您的代码应该是这样的:

//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 
} 
+0

真棒,谢谢! – Stefan 2012-08-10 15:17:16

+0

我可以从HTML5以及WPF调用CLR库吗?还是需要添加步骤? – Stefan 2012-08-10 16:01:59

+0

@Stefan从html5'说'_call时,不确定你的意思。 Html位于.NET边界之外,所以这可能会导致一些复杂的步骤。一个简单的方法虽然会将功能暴露为'WebService',然后你可以通过你的html对javascript进行ajax调用。 – gideon 2012-08-11 10:39:41

1

CInstructment是如何定义的? 如果它是一个结构,你可以很容易编组。创建一个新的结构将StructLayout(Sequential)作为属性(请参阅System.Runtime.InteropServices)并将它传递给您的互操作。为什么你有一个bool的返回类型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

+0

有时他们是结构,有时他们是类(有音乐需要各种功能!),是否有类似的功能可用于类?很好的回归类型,我现在编辑它。 – Stefan 2012-08-10 08:57:55

+0

我会说,如果你使用类,它可以变得更复杂一点。理论上它应该可以工作,但它会变得非常棘手。所以,如果我会是你...我会创建结构来传递数据之间的c + +和C#因为只是看看这个:http://www.codeproject.com/Articles/18032/How-to-Marshal-aC- – 2012-08-10 13:23:08

相关问题