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

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

 2010-09-30 22:46:01 来源:WEB开发网   
核心提示: 自定义marshaler要实现ICustomMarshaler接口,并且提供一个类函数public static ICustomMarshaler GetInstance(string cookie),c#编程指南(十五) 平台调用P-INVOKE完全掌握(完结篇),自定义Mashaler(2)

自定义marshaler要实现ICustomMarshaler接口,并且提供一个类函数public static ICustomMarshaler GetInstance(string cookie),

微软方法的名字很好懂,我也不再一一解释了。关键地方代码中也有注释。

 1   public class TestMashaler : ICustomMarshaler
 2   {
 3     private static object _refObject = null;
 4     private string _cookie = string.Empty;
 5 
 6     public TestMashaler(string cookie)
 7     {
 8       _cookie = cookie; //保存是输入参数使用的Mashaler,还是输出参数使用的Mashaler.
 9      }
10 
11     public void CleanUpManagedData(object ManagedObj)
12     {
13     }
14 
15     public void CleanUpNativeData(IntPtr pNativeData)
16     {  //清理非托管内存,防止内存泄露
17        Marshal.FreeHGlobal(pNativeData);
18     }
19 
20     public int GetNativeDataSize()
21     {
22       return Marshal.SizeOf(typeof(Test));
23     }
24 
25     public IntPtr MarshalManagedToNative(object ManagedObj)
26     {
27       if (ManagedObj is Test)
28       {  //保存ref引用。
29          if (_cookie == "input") _refObject = ManagedObj;
30         IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Test)));
31         Marshal.StructureToPtr(ManagedObj, p, false);
32         return p; //Marshal成指针。
33        }
34       else throw new NullReferenceException();
35     }
36 
37     public object MarshalNativeToManaged(IntPtr pNativeData)
38     {
39       if (pNativeData != IntPtr.Zero)
40       {
41         int temp = pNativeData.ToInt32();
42         if (_cookie == "input")
43         {  //输出参数返回
44            (_refObject as Test).test = temp;
45           return _refObject;
46         }
47         else if (_cookie == "output")
48         {  //返回值返回。
49            return pNativeData.ToString();
50         }
51         return null;
52       }
53       else throw new NullReferenceException();
54     }
55 
56     public static ICustomMarshaler GetInstance(string cookie)
57     {
58       return new TestMashaler(cookie);
59     }
60   }

最后还是建议大家使用微软提供的,自己实现的虽然很灵活很BT很邪门,但是还是很容易出错。上面的代码也仅供娱乐消遣了!!

上一页  1 2 

Tags:编程 指南 十五

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