注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

C#精髓摘要(10)  

2011-07-25 09:29:50|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

接前一部分,地址在

这里

C#精髓》一书属于O'Reilly出版的动物系列技术书籍,这一系列的书算是赫赫有名了,趁现在有空,走马观花地读一下这本书。

C精髓摘要(2) - Castor - 趁年轻,多折腾~~
封面上的动物是星鼻鼹鼠(Condylura cristata)。与所有鼹鼠一样,星鼻鼹鼠主要居住在自己挖的地下隧道中,觅食时才出来。鼹鼠的身体上布满了防水的灰色短毛,大约6~8英寸长。它们的显著特征是长长的爪子,用于挖掘和觅食都非常理想。它们的眼睛、耳朵很小,牙齿非常锐利。视力和听觉很差。

星鼻鼹鼠的名字来源于它们鼻子上的25个触须,触须可以帮助鼹鼠找到食物,主要是昆虫、蠕虫、小鱼和其他小的池塘生物。星鼻鼹鼠是鼹鼠家族中的游泳健将,可以潜入水中捕鱼。它们喜欢住在沼泽中,分布于美国东北部和加拿大东南部。
星鼻鼹鼠是哺乳动物,雌鼹鼠每年可以生3~6只幼崽。
星鼻鼹鼠对人类的危害比其他鼹鼠要小,因为它偏爱水生食物,很少到人类的后院活动。
===================================================================================================

同本机DLL互操作

PInvoke:平台调用服务的缩写。允许C#操作非管制代码。例如:

[DllImport("user32.dll")]

static extern int MessageBox(int hwnd, string text, string caption, int type);

如果调用:MessageBox(0, "Hello!", "DllImport", 0);就会显示对话框。

CLR中的列集器知道如何在.NET类型和非管制类型之间转换参数以及返回值。

列集常见类型

列集器知道COMWindows API核心类型,并提供CLR的默认转换。可以使用MarshalAs属性信息覆盖默认转换。

列集类和结构

将类或者结构传递C函数需要用StructLayout属性信息生成类或者结构。

非管制代码的回调

C#可以使用回调让C函数调用。C#中委托类型用在有函数指针时。如下:

using System;

using System.Runtime.InteropServices;

namespace ConsoleApplication1

{

    class Program

    {

        delegate bool CallBack(int hwnd, int lParam);

        [DllImport("user32.dll")]

        static extern int EnumWindows(CallBack hWnd,int lParam);

        static bool PrintWindow(int hWnd, int lParam)

        {

            Console.WriteLine(hWnd);

            return true;

        }

        static void Main(string[] args)

        {

            CallBack e = new CallBack(PrintWindow);

            EnumWindows(e, 0);

            Console.Read();

        }      

    }

}

预定的互操作支持属性信息

常用的与本机Win32 DLL互操作属性信息,位于System.Runtime.InteropServices命名空间下。

DllImport属性信息

[DllImport(dll-name

[, EntryPoint=function-name]?

[, CharSet=charset-enum]?

[, SetLastError=true|false]?

[, ExactSpelling= true|false]?

[, CallingConvention=callconv-enum]?)]

(用于方法)

StructLayout属性信息

[StructLayout(layout-enum

[, Pack=packing-size]?

[, CharSet=charset-enum]?

[, CheckFastMarshal= true|false]?)?]

(用于类和结构)

FieldOffset属性信息

[FieldOffset (byte-offset)](用于字段)

MarshalAS属性信息

[MarshalAs(unmanaged-type)

[, named-parameters]?]

(用于字段、参数返回值)

覆盖了列集器应用于参数或者字段的默认列集行为,unmanaged-type取自UnmanagedType枚举。可参考MSDN

http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.unmanagedtype(v=VS.80).aspx

Inout属性信息

[In][Out]

(用于参数)

In指定数据列集入调用者,而Out指定数据从被调用方法到调用者列集出来,两者可结合使用。

绑定COMC#对象

通过早或者迟绑定实现。迟绑定需要C#一侧使用反射而在COM一侧使用IDispatch

C#调用COMTlbImp.exe获取COM类型库并在配件中生成等价的元数据。

COM调用C#TlbExp.exeRegAsm.exe可以从配件生成COM类型库。

COM对象暴露给C#

实际上处理的是RCWRuntime Callable Wrapper,运行时可调用包裹器)的代理。

System.Runtime.InteropServices.Marshal类型的静态方法ReleaseComObject释放COM对象。

C#对象暴露给COM

运行时环境创建一个CCWCOM Callable Wrapper,可调用包裹器),用于维护一个指向起包裹对象的可跟踪引用。

C#中映射COM

RCW使得COM对象的方法和普通C#实例方法一样。COM中方法正常则返回HRESULT,表示成功或者失败,还可以使用out参数传出值,C#中方法正常返回结果值,否则会抛出异常。

COM互操作属性信息

位于System.Runtime.InteropServices命名空间下。

ComVisible属性信息

[ComVisible(true|false)]]

用于配件、接口、枚举、类和结构、委托,可控制类型是否暴露给COM

DispId属性信息

[DispId(sipatch-id)]

用于方法、属性、字段,指定他们的DispID,以用于通过IDispatch接口访问。

ProgId属性信息

[ProgId(progid)]

用于类,,指定所用的ProgID

Guid属性信息

[GuidAttribute(guid)]

用于配件、接口、枚举、类和结构、委托,指定GUID,要用完整的类型名指定

HasDefaultInterface属性信息

用于类,指定第一个继承接口应用作为默认接口。

InterfaceType属性信息

[InterfaceType(ComInterfaceType)]

用于接口,生成一种COM接口类型(dualIDispatch或者IUnknown派生接口)

ComRegisterFunction属性信息

[ComRegisterFunction]

用于方法,在在注册配件过程中,请求RegAsm.exe调用一个方法。

NoIDispatch属性信息

[NoIDispatch]

用于方法,指定对类的IID_Idispatch的请求应返回E_NOINTERFACE


  评论这张
 
阅读(858)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016