反向 PInvoke 并创建一个完整的非托管 C# 程序

Posted

技术标签:

【中文标题】反向 PInvoke 并创建一个完整的非托管 C# 程序【英文标题】:Reverse PInvoke and create a full unmanaged C# program 【发布时间】:2010-05-11 16:11:51 【问题描述】:

我知道这是一个奇怪的问题,但想法很简单:我更喜欢 C# 语法而不是 C++: - 直接在属性内的设置器和获取器 -接口 -foreach 语句 - 可以声明一个隐式转换运算符

其他小事...

我真正不知道的是,如果我不使用任何命名空间(甚至是系统),是否可以在 C# 中导入 c++ dll(尤其是标准库)

这个想法只是使用您通常在 C++ 中使用的所有内容编写程序(CLR 中没有),例如 printf

感谢您的任何回答

【问题讨论】:

Exporting dll functions to unmanaged programs的可能重复 【参考方案1】:

不,不能简单地将现有的 C 或 C++ 文件导入 C# 项目。它们是非常不同的语言,不能在源代码级别混合使用。

混合 C# 和 C++/C 应用程序的方法是在 PInvoke 或 COM 互操作级别。这通过复制 C# 中的签名并允许 C# 编译器确定本机类型的二进制布局以在语言之间编组来工作。

【讨论】:

【参考方案2】:

现在有一些接近这个的东西

.NET Native 将 C# 编译为与 C++ 类似的本机机器代码。您将继续受益于 .NET Framework 的生产力和熟悉度以及本机代码的出色性能。

它仅适用于 Windows 应用商店应用(未来可能会出现桌面应用):

桌面应用是我们战略中非常重要的一部分。最初,我们专注于使用 .NET Native 的 Windows 应用商店应用程序。从长远来看,我们将继续改进所有 .NET 应用程序的本机编译。

还有

应用程序将作为完全独立的本机编译代码部署在最终用户设备上(当 .NET Native 投入生产时),并且不会依赖目标设备/机器上的 .NET Framework

【讨论】:

考虑到最近的更新,我更新了您的答案。听起来不错!【参考方案3】:

没有;这是不可能的。特别是,C# 不支持 C++ 模板。

【讨论】:

嗯,c# 有泛型,但它们不一样......所以没有办法使用 c# 语法来创建类似游戏的东西(是的,我知道 XNA,但我想完全写一些东西与 CLR 分离,使用 directx 或 opengl)

以上是关于反向 PInvoke 并创建一个完整的非托管 C# 程序的主要内容,如果未能解决你的问题,请参考以下文章

C# PInvoke 传递出 unsigned char*

从传递回完整对象模型的非托管 C++ 调用 C# 方法

C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”

使用平台调用(PInvoke)实现C#调用非托管C++代码

使用平台调用(PInvoke)实现C#调用非托管C++代码

从 C# 调用非托管 C++ VS 6.0 MFC dll