我想从我的C#代码中调用我的非托管C ++库。 需要采取哪些潜在的陷阱和预防措施? 感谢您的时间。

===============>>#1 票数:3

您可以使用这几个路由 - 一个,您可以更新您的非托管C ++库,使其具有托管C ++扩展包装,并让C#直接使用这些类。 这有点耗时,但它为传统的非托管代码提供了一个很好的桥梁。 但请注意,托管C ++扩展有时难以自行导航,因为语法类似于非托管C ++,但足够接近,以至于训练有素的眼睛将能够看到差异。

另一条路由是你的umnanaged C ++实现COM类,并让C#通过自动生成的互操作程序集来使用它。 如果你足够了解COM的方式,这种方式会更容易。

希望这可以帮助。

===============>>#2 票数:1

你正在描述P / Invoke。 这意味着您的C ++库需要通过DLL接口公开自己,并且接口需要足够简单,以通过调用属性描述P / Invoke。 当托管代码调用非托管世界时,必须对参数进行编组,因此似乎可能会有轻微的性能损失,但您必须进行一些测试以查看编组是否重要。

===============>>#3 票数:1

最简单的方法是确保所有C ++功能都作为'C'样式函数公开。 确保将函数声明为_stdcall。

extern“C”__ declspec(dllexport)int _stdcall Foo(int a)

确保你正确编组,尤其是像指针和wchar_t *这样的东西。 如果你弄错了,可能很难调试。

从任何一方调试它,但不是两者都调试。 调试混合本机和托管时,调试器可能会变得非常慢。 一次调试1面可以节省大量时间。

更具体的问题需要一个更具体的问题。

===============>>#4 票数:1 已采纳

这个问题太宽泛了。 唯一合理的答案是P / Invoke,但这有点像说如果你想为Windows编程,你需要知道Win32 API。

几乎所有的书籍都是关于P / Invoke( http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X )编写的,当然整个网站都已制作完成: http:// www.pinvoke.net/

===============>>#5 票数:0

您还可以通过P / Invoke调用非托管代码。 如果您的代码当前不使用COM,这可能会更容易。 我猜你可能需要使用“C”绑定在你的代码中写一些特定的导出点,如果你走这条路线的话。

根据我的经验,你必须要注意的最重要的事情是缺乏确定性的垃圾收集意味着你的析构函数不会在你以前想到它们时运行。 您需要牢记这一点并使用IDisposable或其他方法来确保在您希望的情况下清理托管代码。

===============>>#6 票数:0

当然,如果您将代码打包为具有外部入口点的DLL,那么总会有PInvoke。 没有一个选项没有痛苦。 它们取决于a)你写COM或管理C包装的技巧b)在PInvoke打你的手臂。

===============>>#7 票数:0

我会看看swig ,我们使用它来对我们的项目产生良好的影响,将我们的C ++ API暴露给其他语言平台。

这是一个维护良好的项目,可以有效地构建一个围绕C ++库的瘦包装器,它可以允许C#等语言直接与您的本机代码通信 - 从而避免了必须实现(和调试)粘合代码的麻烦。

===============>>#8 票数:0

如果你想要一个好的PInvoke示例,你可以看看PInvoke.net 它举例说明了如何调用大多数win api函数。

您也可以使用本文中的工具Clr Inside Out:PInvoke将您的.h文件转换为c#包装器。

  ask by community wiki translate from so

未解决问题?本站智能推荐:

3回复

将非CLR代码链接到.NET应用

我是Visual C ++ 、. NET和Windows编程世界(来自Objective-C / Cocoa)的新手,并且尝试使用CFLite(Open CoreFoundation Lite)库,该库已编译为.lib。文件。 它是用纯的,非托管的C语言编写的,我想在托管的CLR .NET应用
1回复

使用非托管代码的C#应用​​程序加载msvcr90.dll + msvcr80.dll + msvcr100.dll。 这有关系吗?

我目前正在调试一个调用非托管dll的C#应用​​程序。 不同的非托管dll似乎链接到C运行时库的不同版本。 这可能会引起问题吗? 我想到的问题类型是诸如重复的全局变量引起混乱的事情,例如,运行时代码写入一个全局变量,而用户代码则从另一个全局变量读取。 _errno。
1回复

如何从C#调用C非托管DLL中的类ref对象

我正在尝试调用C ++ umnamanged dll ref。 C#应用程序中的class对象。 与VC ++一起使用的DLL函数调用。 我的VC ++代码如下 我的C#代码如下 在C#中,一切正常,但是不调用quote_notify函数吗?
2回复

将字符串值从非托管代码传递到托管代码?

嗨,我从本质上指向字符串的非托管代码返回了LPTSTR类型的对象。 我现在处于托管代码中,并且无法在C#中读取它。 返回的字符串只是“ YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY”。 这是我的托管代码段。 这有什么问题吗? 我如何从非
8回复

C#性能 - 我应该用c ++编写重计算方法吗?

我正在构建一个定量库的原型,使用图像处理技术进行一些信号分析。 我完全用C#构建了初始原型,但性能不如预期。 大多数计算是通过重矩阵计算完成的,而这些计算大部分时间都在进行。 我想知道为非托管C ++代码编写C ++ / CLI接口是否值得。 有没有人经历过这个? 其他有关优化C#
2回复

C#.Net中的Win32应用程序

我已经开发了基于本机调用的基于窗口的应用程序。 在此应用程序中,我正在处理大量鼠标事件,键盘挂钩,绘画等。 我的问题是,如何在C#.Net中使用该Win32应用程序(非托管)? 我已经阅读了有关包装Win32应用程序的托管包装的信息,如果您认为这是最好的选择,那么请向我推荐任何可以
2回复

在Windows Phone应用程序中包括所有其他不受管的依赖项dll的地方

我想将一些C ++非托管dll导入我的Windows Phone应用程序。 我可以这样做吗? 在调试dll时找不到抛出异常。 任何人都可以帮助我将那些依赖项dll放在哪里。 谢谢 ...
4回复

在C ++非托管dll和C#托管dll之间发送Byte [] []

我有一个非托管的C ++ dll,可导出以下方法: inp和outp的大小可以高达10KB,从C#托管代码调用这些方法的最佳性能方法是什么? 编辑:我做了以下实现,并且有效,但这是最有效的方法。 C ++: C#:
2回复

使用非托管DLL从.NET进行系统范围的Shell挂钩

我过去曾成功使用过以下CodeProject文章中提供的代码,但它似乎只能在Vista / 7上部分工作(我猜是因为UAC)。 它适用于当前线程,但不会占用系统范围的活动。 我尝试在清单中添加requireAdministrator并签署非托管程序集和托管程序集,但这似乎无济于事。 使
1回复

如何防止非托管dll调用访问冲突?

我们继承了一种传统的系统,用于读取和从瞄准枪读取。 该系统最初是在带有.Net 1.1(VS2003?)的XP上构建的。 在VS2008上使用.net 3.5重新编译它时,我们在调用dll时遇到访问冲突(未触及dll)。 原始程序(使用基本相同的代码)在我们的生产机器上正常运行。 崩