![]() |
1
0
相当于
所以,如果你在C/C++中有这个:
然后您可以用C#声明它,它将在x86和x64上工作(好吧,您不会得到任何高于32的位值,当然,hi uint会丢失):
对于x86来说,它是有效的,因为,嗯,它应该是这样的。 对于x64,它神奇地工作,因为参数是 always 64-bit 幸运的是,额外的hi位被errrhh归零。。。系统的一些组件(CLR?C/C++编译器?我不确定)。 对于struct字段这是一个完全不同的故事,最简单的(对我来说)似乎使用IntPtr并添加一些帮助程序来简化编程。 但是,如果您真的想为使用您的结构的开发人员添加一些糖,我已经添加了一些额外的示例代码。重要的是,这个代码可以从C/C++定义中生成。
注意,如果对选项和选项64使用类而不是结构,则可以删除
下面是关于同一主题的另一个讨论: C# conditional compilation based on 32-bit/64-bit executable target 基本上,您还可以对x86和x64目标使用条件编译常量,并让您的代码使用这些常量。 |
![]() |
2
0
我最后做的是: 首先是一些目标:
功能 从DLL导出的C函数以尽可能接近本机(C)类型的.NET类型显示在DllImport中。然后每个函数都用一个更内联的-NET facade包装。 这完成了两件事:
专门为
下面是一个使用伪代码的示例: C函数:
C#DllImport公司:
C#门面(伪代码):
结构
与包含
我对facade采取的具体实现方法是将每个字段设置为一个属性,并将Interop结构作为后备存储。下面是一个小例子: C结构:
C#(伪代码):
虽然有时有点乏味,但我发现,到目前为止,这种方法只使用了2种结构,所以它产生了很大的灵活性,并将一个干净的API暴露在我的.NET包装器的消费者中。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 5 月前 |