WEB开发网
开发学院软件开发C语言 c#编程指南(十五) 平台调用P-INVOKE完全掌握(完结... 阅读

c#编程指南(十五) 平台调用P-INVOKE完全掌握(完结篇),自定义Mashaler

 2010-09-30 22:46:01 来源:WEB开发网   
核心提示:这是P-INVOKE系列的最后一篇,也是万剑归宗的一篇,c#编程指南(十五) 平台调用P-INVOKE完全掌握(完结篇),自定义Mashaler,基本上只要函数签名对了,用他可以传递任何参数,函数的输入输出参数和返回值你也可以随心所欲地修改,把这个放在最后也是最完美的结局吧!!C++:测试代码如下:1structTes

这是P-INVOKE系列的最后一篇,也是万剑归宗的一篇,基本上只要函数签名对了,用他可以传递任何参数,函数的输入输出参数和返回值你也可以随心所欲地修改。

把这个放在最后也是最完美的结局吧!!

C++:测试代码如下:

 1 struct Test
 2 {
 3   int test;
 4 };
 5 
 6  //static Test _test;
 7  
 8 Test GetTest(Test * lpTest)
 9 {
10   lpTest->test = 200;
11   return * lpTest;
12 }

C#:在P-INVOKE中,我把C++指针参数Marshal成C#类的输入参数,把C++返回值为结构体的Marshal成字符串。注意下面的P-INVOKE声明。

UnmanagedType.CustomMarshaler表明使用自定义的marshaler.

 1   [StructLayout(LayoutKind.Sequential)]
 2   public class Test
 3   {
 4     public int test;
 5   }
 6 
 7 
 8   public class PInvokeTest
 9   {
10     [DllImport("TestDll")]
11     [return:MarshalAs(UnmanagedType.CustomMarshaler,MarshalTypeRef=typeof(TestMashaler),MarshalCookie="output")]
12     public static extern string GetTest([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(TestMashaler), MarshalCookie = "input")] ref Test test);
13     //把返回值Marshal成字符串,自定义Marshal 参数。
14  
15     public void Run()
16     {
17       Test test = new Test();
18       test.test = 100;
19 
20       string temp = GetTest(ref test);
21       Console.WriteLine(test.test + "," + temp);
22     }
23 
24   }

1 2  下一页

Tags:编程 指南 十五

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接