反向 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# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”