F#互操作中的一招

当我尝试破解.CAB文件的时候, 我发现F#里面的COM交互不同于C#。

在从"COM"选项卡增加了"Microsoft Shell Controls And Automation"之后,C#里面的实例代码像下面的代码。

bool ExpandCabFile(string CabFile,string DestDir)
   
{
      if (!Directory.Exists(DestDir))return false;
      Shell sh = new Shell();
      Folder fldr =sh.NameSpace(DestDir);
      foreach (FolderItem f insh.NameSpace(CabFile).Items()) fldr.CopyHere(f, 0);
      return true;
    }

把C#翻译成F#应该是很简单的事。但是事实证明Shell不能被创建,因为它是一个接口!是的,你没有在读一个错误。如果你使用Object Viewer,  Shell确实是一个接口。

C#这边可以使用 CoClass特性,因此新的语句调用到ShellClass。事实上, 你不能在C#代码里实例化ShellClass。

[CoClass(typeof(ShellClass))]

[Guid("866738B9-6CF2-4DE8-8767-F794EBE74F4E")]

public interface Shell :IShellDispatch5

{

}

在F#这边,你必须创建ShellClass来代替Shell。所以如果你想转换包含COM组件的C#代码到F#代码。通过Coclass特性试着找到真正的类。完整的F#代码如下所示:

let shell = new ShellClass()

let folder =shell.NameSpace(Path.GetDirectoryName(fn))

let fileName= Path.GetFileName(fn)

let currentFolder =

if not(Directory.Exists currentFolder)then

Directory.CreateDirectorycurrentFolder |> ignore

for item inshell.NameSpace(fn).Items()do

folder.CopyHere(item,0)

 

 

译文出处:http://apollo13cn.blogspot.com/2012/04/trick-in-f-interop.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值