C# 调用C++dll中的结构体的定义
2010-06-11 16:27
477 查看
为用户定义的结构指定自定义封送处理
可以为传递到非托管函数或从非托管函数返回的结构和类的字段指定自定义封送处理属性。通过向结构或类的字段中添加 MarshalAs属性可以做到这一点。还必须使用 StructLayout 属性设置结构的布局,还可以控制字符串成员的默认封送处理,并设置默认封装大小。
示例 3
本示例说明如何为结构指定自定义封送处理属性。
请考虑下面的 C 结构:
C/C++ code
在 C# 中,可以使用 StructLayout 和 MarshalAs 属性描述前面的结构,如下所示:
C# code
运行示例
C30A0AE5
代码讨论
在前面的示例中,CreateFontIndirect 方法使用了一个 LOGFONT 类型的参数。MarshalAs 和 In 属性用于限定此参数。程序将由此方法返回的数值显示为十六进制大写字符串。
转自:
http://topic.csdn.net/u/20100610/16/a3dc7ee0-88c8-4bb5-a19c-a054af19a233.html?63450
参考:
http://topic.csdn.net/u/20090106/10/cd130dad-4d61-4bad-bb97-5d786fee9b26.html
可以为传递到非托管函数或从非托管函数返回的结构和类的字段指定自定义封送处理属性。通过向结构或类的字段中添加 MarshalAs属性可以做到这一点。还必须使用 StructLayout 属性设置结构的布局,还可以控制字符串成员的默认封送处理,并设置默认封装大小。
示例 3
本示例说明如何为结构指定自定义封送处理属性。
请考虑下面的 C 结构:
C/C++ code
typedef struct tagLOGFONT { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT;
在 C# 中,可以使用 StructLayout 和 MarshalAs 属性描述前面的结构,如下所示:
C# code
// logfont.cs // compile with: /target:module using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public class LOGFONT { public const int LF_FACESIZE = 32; public int lfHeight; public int lfWidth; public int lfEscapement; public int lfOrientation; public int lfWeight; public byte lfItalic; public byte lfUnderline; public byte lfStrikeOut; public byte lfCharSet; public byte lfOutPrecision; public byte lfClipPrecision; public byte lfQuality; public byte lfPitchAndFamily; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=LF_FACESIZE)] public string lfFaceName; } 有关 StructLayout 属性的语法的更多信息,请参见 StructLayoutAttribute 类。 然后即可将该结构用在 C# 代码中,如下所示: // pinvoke.cs // compile with: /addmodule:logfont.netmodule using System; using System.Runtime.InteropServices; class PlatformInvokeTest { [DllImport("gdi32.dll", CharSet=CharSet.Auto)] public static extern IntPtr CreateFontIndirect( [In, MarshalAs(UnmanagedType.LPStruct)] LOGFONT lplf // characteristics ); [DllImport("gdi32.dll")] public static extern bool DeleteObject( IntPtr handle ); public static void Main() { LOGFONT lf = new LOGFONT(); lf.lfHeight = 9; lf.lfFaceName = "Arial"; IntPtr handle = CreateFontIndirect(lf); if (IntPtr.Zero == handle) { Console.WriteLine("Can't creates a logical font."); } else { if (IntPtr.Size == 4) Console.WriteLine("{0:X}", handle.ToInt32()); else Console.WriteLine("{0:X}", handle.ToInt64()); // Delete the logical font created. if (!DeleteObject(handle)) Console.WriteLine("Can't delete the logical font"); } } }
运行示例
C30A0AE5
代码讨论
在前面的示例中,CreateFontIndirect 方法使用了一个 LOGFONT 类型的参数。MarshalAs 和 In 属性用于限定此参数。程序将由此方法返回的数值显示为十六进制大写字符串。
转自:
http://topic.csdn.net/u/20100610/16/a3dc7ee0-88c8-4bb5-a19c-a054af19a233.html?63450
参考:
http://topic.csdn.net/u/20090106/10/cd130dad-4d61-4bad-bb97-5d786fee9b26.html
相关文章推荐
- C#调用C++dll 结构体参数传递问题
- c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)
- c# 调用 研华库函数中 C++ 非托管 Dll 一例(包含指针成员的结构体的调用) [转贴]
- C#调用C++ dll时,结构体引用传参的方法
- C#调用C(C++)dll,针对结构体的微软小工具
- C#调用C++生成的dll,参数有结构体数组
- C#调用C++ DLL 中定义的函数
- c# 调用 研华库函数中 C++ 非托管 Dll 一例(包含指针成员的结构体的调用)
- (学习笔记)C++底层dll C#调用问题汇总:结构体的不同之处
- C#调用C++DLL数据封送结构体转换工具
- c# 调用 c++ dll 参数为结构体数组指针
- C#调用c++Dll 结构体数组指针的问题
- C#调用c++的dll,结构体数组作为引用参数的传递方式
- C# 发中调用一个采用C++封装好的dll, 其结构体中的二维数转换
- C++通过CLR调用C#dll--如何定义合适的参数
- C#调用C++写的dll,包含结构体转换和C#动态调用dll(头文件转换为类)
- c# 调用 研华库函数中 C++ 非托管 Dll 一例(包含指针成员的结构体的调用)
- C#调用C++dll 结构体参数传递问题
- C#中调用C++写的DLL注意事项
- C#调用C++dll