Tag: c ++ cli

在c ++ / cli dll中引发事件并在c#中使用

在我的c#app中,我有一个进度条。 C#app正在调用一个处理大量文件的c ++ / cli dll。 当在dll中处理每个文件时,我想跟踪它在c#app中的进度。 为此我需要在c ++ / cli中引发一个事件并在C#中使用它。 从MSDN我收集我需要在我的c ++ / cli类中: delegate void Del(int); event Del^ E; void fire(int i) { E(i); } MSDN活动 在MSDN中,事件的接收者位于相同的c ++ / cli项目中,并显示如何引发事件。 在我的项目中,c#app将接收在处理每个文件后应在c ++ / cli中引发的事件。 我也搜索了很多,但还没弄清楚。 所以,我的问题是,如何在c ++ / cli中引发此事件,以及如何将c#程序连接到它? 一些代码显示了这样做的方式将非常感激。 谢谢! 马特,谢谢你的回应。 在C#我正在尝试 MW.Class1 oM = new MW.Class1(); oM.fire += ProgressBarChanged(int i); 它不能编译说不能分配因为fire是一个方法组。 […]

将位图从c#传递到c ++

我有一个基于opencv用C ++编写的图像处理函数。 在我的wpf应用程序中,我使用AForge库来访问网络摄像头并在UI上更新它。 这是处理新帧的function。 void UI_NewFrame(object sender, NewFrameEventArgs eventArgs) { try { System.Drawing.Bitmap bitmapFrame = (Bitmap)eventArgs.Frame.Clone(); MemoryStream ms = new MemoryStream(); bitmapFrame.Save(ms, ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); BitmapImage bitmapImageFrame = new BitmapImage(); bitmapImageFrame.BeginInit(); bitmapImageFrame.StreamSource = ms; bitmapImageFrame.EndInit(); bitmapImageFrame.Freeze(); CurrentFrame = bitmapImageFrame; } catch (Exception ex) { Debug.WriteLine(“fatal::” + ex.Message); } } 这是我的c ++代码: void FaceTracker(unsigned char* imageBuffer, […]

创建C ++ / CLI OpenCV包装器以在C#中使用

我想创建一个OpenCV包装器以在C#中使用它。 我使用此链接作为参考http://drthitirat.wordpress.com/2013/06/06/use-opencv-c-codes-in-a-vc-project-solution-of-creating-a-managed- clr-wrapper /到目前为止,我已经创建了一个包含我的图像处理代码的C ++控制台应用程序。 我还创建了一个C ++ / CLI类库,其中包含了OpenCV代码,但是当我尝试构建它时,我得到了许多关于C ++代码中使用的OpenCV函数的未解决的外部错误,我不知道如何解决它…知道如何解决这个问题吗? 在C#中使用C ++ OpenCV代码有一种更简单,更简单的方法吗? 我不想使用Emgu或任何其他包装器,我的图像处理代码必须使用C ++。

C ++和C#互操作性:P / Invoke与C ++ / CLI

在找到C#和C ++之间的互操作方法的过程中,我发现这篇文章解释了P / Invoke。 我读了很多文章声称C ++ / CLI不是精确的C ++,需要一些努力来修改原始的C ++代码。 我想问一下,当我想要从C#对象中使用一些C ++对象(代码/数据)时,最佳方法是什么。 看起来为了使用P / Invoke,我应该提供C风格的API。 这是真的吗? 我的意思是,有没有办法将C ++对象导出到C#,如带有P / Invoke的SWIG? 或者,我是否必须将SWIG用于此目的? 将C ++更改为C ++ / CLI有多难? 与将C ++重写为C#相比,是否值得尝试? C ++设计得很好,所以将它实现到C#并不是很重要。 (关于主题问题)还有其他方法吗? 我的意思是,如果我想使用C ++中的C#代码,有没有办法这样做?

C ++ Interop:如何从本机C ++调用C#类,并且该类是非静态的?

我有一个用本机C ++编写的大型应用程序。 我还有一个C#课我需要打电话。 如果C#类是静态的,那么它将是微不足道的(Web上有很多例子) – 只需编写混合的C ++ / CLI包装器,导出接口,然后就完成了。 但是,C#类是非静态的,并且不能更改为静态,因为它有一个接口(如果您尝试使C#类静态,编译器将生成错误)。 有没有人遇到过这个问题 – 如何将非静态C#类导出到本机C ++? 更新2010-11-09 最终的解决方案:尝试COM,这很好用,但不支持结构。 所以,使用C ++ / CLI包装器,因为我绝对需要能够在C ++和C#之间传递结构。 我根据这里的代码编写了一个混合模式.dll包装器: 如何:使用C ++ Interop的Marshalarrays 如何:使用C ++ Interop的Marshal结构 由于目标类是非静态的,我不得不使用单例模式来确保我只实例化目标类的一个副本。 这确保一切都足够快,以满足规格。 如果你想让我发布一个演示项目,请联系我(虽然,公平地说,我从C ++调用C#,而现在大多数人都希望从C#调用C ++)。

托管C ++以形成c#和C ++之间的桥梁

我有点生疏,实际上我的C ++真的很生疏。 从大学一年级开始就没有触及它,所以已经有一段时间了。 无论如何,我正在做与大多数人相反的事情。 从C ++调用C#代码。 我在网上做了一些研究,似乎我需要创建一些托管C ++来形成一个桥梁。 使用__declspec(dllexport)然后从中创建一个dll并使用整个东西作为包装器。 但我的问题是 – 我真的很难找到例子。 我找到了一些基本的东西,有人想将C#版本用于String.ToUpper(),但这是非常基本的,只是一个小代码片段。 任何人都有任何想法,我可以在哪里寻找更具体的东西? 注意,我不想使用COM。 目标是根本不触及C#代码。

SQL Server:“为程序集’测试’创建程序集失败,因为程序集’测试’格式错误或不是纯.NET程序集。”

当我尝试将混合模式C ++ / CLI程序集加载到SQL Server 2012时,出现此错误: CREATE ASSEMBLY [Test] AUTHORIZATION [dbo] from ‘H:\test.dll’ WITH PERMISSION_SET = SAFE Msg 6544,Level 16,State 1,Line 1为程序集’Test’创建程序集失败,因为程序集’Test.dll’格式错误或不是纯.NET程序集。 无法validation的PE标头/本机存根。

在C#中使用本机dll中的c ++类

我花了大约3天时间阅读这个主题…… 由于许多教程并回答了有关如何创建本机DLL的问题,我现在完全迷失了。 如果你有空闲时间,请小心解释一下这个话题,并帮助我 – 如果你没有时间,那就去那里我的问题的简单forms…… 以下是我目前对该主题的了解: 1)我需要在类名之前使用定义为__declspec(ddlexport)和__declspec(ddlimport)的宏来导出所有类方法和变量 2)我需要在某处使用extern “C” ,但我不确定到底在哪里 3)有很多方法可以做到这一点(将类作为参数传递给接受它的方法c approch / export class / use interface) 这就是我迷失的原因和方式: 1)大多数教程都是用于导出方法,我怀疑与类相比很容易(在C#中你使用[Dllimport,DLL的名称]然后你调用每个方法) 2)我是否需要在课堂上使用extern “C” ? 3)如果我使用带接口的工厂方法,我是否需要分发包含接口的.h文件? 这是我想要做的: 1)创建一个带有类的C ++ DLL,并导出要在.NET或C ++中使用的类(我想保护我的代码,因为我看到了使用存储的IL可以轻松地反转托管代码。) 2)我想有2个DLL,一个C ++本机DLL,另一个将是包装DLL,所以如果有人想在C ++中使用我的类,他可以直接使用本机DLL,如果他想在C#/ VB.net他可以使用C ++ / CLI包装器DLL … 3)没有libs,没有头文件,没有def文件,……等…..只有纯DLL(2个文件将被释放) 简单的forms 假设我想从这个C ++类中实例化C#中的对象 Class Human { private: int Pee_Meter; public: Void Do_Pee() { //stuff here }; }; […]

如何使用Action委托参数方法将win32应用程序中的c ++方法的地址传递给ac#方法

我有一个使用C#库的win32应用程序。 C#库有一个方法,其中Action委托是一个参数,如下所示: public NetSocket(Action action) 我在win32应用程序中有一个ref类,其方法与Action委托签名相匹配。 我如何将此方法作为上面列出的NetSocket方法中的Action参数传递? Ben你的解决方案似乎有效,但是在将win32应用程序中的action delegate方法的System:Sting ^输入参数与C#代码中的Action委托的String输入参数进行匹配时存在编译错误。 c#代码中的Action委托使用String作为输入参数,win32代码中的Action委托方法尝试使用System::String^进行匹配以匹配它,但这不起作用。 // win 32 app – void ServerClass::ActionMethod(int iCommand, int iClientIndex, System::String^ message) // win32 app -server = gcnew NetSockets::NetSocket(gcnew Action(this,&ServerClass::ActionMethod)); // csharp – public NetSocket(Action action) 是否需要使用一些封送方法来将win32代码中使用的System::String与C#代码中使用的System::String进行匹配? 我传递System::String错误还是必须要做其他事情? 我必须做什么来将System::String^ message参数与string参数匹配? 谢谢 纠正我尝试了你的解决方案,它给出了以下错误: 1错误C3352: ‘void ServerClass::ActionMethod(int,int,System::String ^)’ :指定的函数与委托类型’void (void)’不匹配 @Ben:越来越近了。 现在当我使用你的解决方案编译代码时,我得到一个内部编译错误,如下所示: 错误C1001:编译器中发生内部错误。 c:\ program files(x86)\ […]

从C ++传递一个函数指针,由C#调用 – 函数的参数包括一个宽字符串(LPCWSTR)

我正在编写一个C#库供本机C ++应用程序使用。 我使用C ++ / CLI作为互操作性机制。 我需要将回调函数从C ++传递给C#(使用C ++ / CLI作为中间层)。 C#库需要使用零终止的宽字符串来调用C ++函数; 即回调函数的原型是 Func(LPCWSTR pszString); 还有其他参数,但它们对于这个讨论并不重要。 我搜索网,发现Marshal.GetDelegateForFunctionPointer方法,我可以使用。 这个问题是它将System.String从C#转换为char *而不是我正在寻找的wchar_t *。 此外,如果可能的话,实现此代码示例的最佳方法是什么,包括C ++ / CLI部分。 C ++ / CLI dll依赖于C#dll。 方法需要同步调用。