从 WPF 应用程序调用 C++ 代码时如何定义变量?

Posted

技术标签:

【中文标题】从 WPF 应用程序调用 C++ 代码时如何定义变量?【英文标题】:How do variables get defined when calling C++ code from a WPF application? 【发布时间】:2012-08-10 08:43:22 【问题描述】:

我有一个 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 代码中引用 CIInstrument

似乎有很多使用字符串的例子,你能不能只使用某些预定义的数据类型之类的?

【问题讨论】:

AFAIK 没有任何课程。您应该创建一个 C++\CLI dll 项目,在那里您可以将 CInstrument 包装到一个 .NET 类中,然后在 WPF 中使用它。见this article for more info 太棒了-如果您有时间,请随时将其作为答案,以便我投票并接受它 我添加了我的答案并对其进行了详细说明,因此对其他人有帮助:) 【参考方案1】:

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

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

看到这个codeproject article for more info

原生 C++ 代码只适用于 C++\CLI,有一种叫做 IJW 的东西(它可以正常工作)。另见this article for more。

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

其他语言 > 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

【讨论】:

我可以从 html5 以及 WPF 调用 CLR 库吗?还是需要添加步骤?【参考方案2】:

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

【讨论】:

有时它们是结构,有时它们是类(音乐剧需要各种功能!),是否有类似的功能可用于类?很好的返回类型,我现在已经编辑了。 我会说,如果您使用的是类,它可能会变得更复杂一些。理论上它应该可以工作,但它会变得非常非常棘手。所以如果我是你……我会创建结构来在 c++ 和 c# 之间传递数据,因为只要看看这个:codeproject.com/Articles/18032/How-to-Marshal-a-C-Class

以上是关于从 WPF 应用程序调用 C++ 代码时如何定义变量?的主要内容,如果未能解决你的问题,请参考以下文章

WPF - 如何从视图而不是视图模型显示自定义异常

wpf程序调用cmd命令行的方法(C#语言调用C++写的程序)?

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

如何从 C# 调用 C++ 类

调用 window.open 时如何在 WPF/WebView2 应用程序中创建自定义窗口?

请问如何在c#中用WPF调用Winform变写的用户控件,知道的请给予解说,谢谢!