F#互操作中的一招

本文探讨了从C#到F#中COM组件使用的差异,特别是针对Shell对象的实例化过程。由于F#中无法直接实例化Shell接口,文章提供了具体的代码示例,展示了如何利用CoClass特性找到并实例化正确的类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我尝试破解.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

 

### 如何在Ubuntu Linux中安装RPM包 由于Ubuntu默认使用的软件包管理工具针对的是`.deb`格式而非RPM格式,因此直接安装RPM文件是不可能实现的。为了能够在Ubuntu上成功部署RPM包,可以采用一种间接的方式——即先将RPM包转换成适用于Debian及其衍生发行版(如Ubuntu)能够识别并处理的.deb格式。 #### 使用Alien进行格式转换 对于希望在Ubuntu环境中运行原本设计给基于Red Hat系统的应用程序而言,最常用的办法就是借助名为`alien`的应用程序来完成这一过程[^2]。该工具允许用户轻松地把不同类型的二进制分发包互相转变,其中包括但不限于从RPM到DEB之间的互转操作。 ##### 安装Alien 首先需要确保系统已经更新至最新状态,并通过下面这条指令获取并设置好`alien`: ```bash sudo apt-get update && sudo apt-get install alien ``` ##### 执行转换命令 一旦完成了上述准备工作之后,则可以通过如下所示的具体语法来进行实际的数据迁移工作;这里假设待处理的目标文件位于当前目录之下且命名为`example.rpm`: ```bash sudo alien example.rpm ``` 此命令会自动创建一个新的同名但扩展名为`.deb`的新版本文档在同一路径之中。如果一切顺利的话,那么接下来就可以像平常那样利用常规手段对其进行后续的操作了。 #### 处理新产生的.DEB文件 当获得由前一步骤所生成出来的.deb形式产物以后,便可以直接调用dpkg或是图形界面下的软件中心去执行最终阶段的任务—也就是真正意义上的“安装”。 使用终端的情况下推荐采取这种方式: ```bash sudo dpkg -i example.deb ``` 当然,在某些特殊情况下可能会遇到依赖关系方面的问题而导致失败告终。此时不妨尝试着依靠aptitude或者简单的重新配置未被打勾标记项这两招来回避麻烦: ```bash sudo apt-get install -f ``` 以上便是整个流程的大致介绍,值得注意的一点在于并非所有的跨平台移植都能够百分之百完美无缺地达成预期效果,所以在具体实践中还需视具体情况而定作出适当调整[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值