从 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程序调用cmd命令行的方法(C#语言调用C++写的程序)?
从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?