F#互操作中的一招

F#语言的网络编程 F#是一种强类型的编程语言,它支持多种编程风格,包括函数式编程、面向对象编程和命令式编程。函数式编程:F#鼓励以函数为中心的编程模式,使得代码更加简洁且易于测试。不可变性:F#中的数据结构默认是不可变的,这减少了状态管理的复杂性。强类型系统:F#提供了类型推断功能,可以在编写代码时减少显式类型声明的负担,提高代码的可读性。基于.NET平台:F#与其他.NET语言(如C#和VB.NET)具有良好的互操作性,可以方便地使用.NET库。 阅读详情

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

 

C#与F#双剑合璧:探索.NET生态中的混合编程实践与深度交互 C#与F#在.NET生态中可以无缝交互,通过引用对方编写的模块或类,可以轻松地在同一个项目中混合使用两种语言。通过上述示例,您已经了解了如何从零开始实现C#与F#的交互编程,为进一步探索和利用这两种语言的互补优势奠定了基础。虽然两者在语法和编程模型上存在显著差异,但得益于.NET平台的统一性,C#与F#之间可以无缝交互。以下从零开始逐步介绍如何在.NET项目中同时使用C#和F#,实现代码的混合编写与交互调用,包含详细的代码示例和注释。F#中的元组、选项、列表等类型在C#中可以作为等效的.NET类型使用。 阅读详情

相关推荐

C# 与 F#: 函数式编程的融合

哈喽,各位编程爱好者们!今天咱们要探讨的主题是 C# 和 F# 中的函数式编程。这两种语言虽然各有特色,但都支持函数式编程的一些关键概念。我们将会深入了解这些概念,并通过具体的例子来展示它们是如何工作的。无论你是 C# 的忠实粉丝还是 F# 的新手,这篇指南都会让你受益匪浅!函数式编程是一种编程范式,它强调使用纯函数来构建程序。纯函数指的是没有副作用的函数,也就是说,给定相同的输入,函数总会产生相同的结果,并且不会改变外部状态。通过今天的探索之旅,我们了解了 C# 和 F# 中函数式编程的基础知识。

java专栏 1080

c#使用系统函数System.Shell.Folder.copyHere解压.zip文件

 C#解压.zip文件,网上一搜一大堆方法,有使用System.IO.Compression.GZipStream的,有使用J#库函数的,也有仿Java自己写库函数的,但好多都不大好使,最终发现还是系统函数System.Shell.Folder.copyHere(oItem [, intOptions])最为好使。具体方法如下:1. 添加引用 Shell32.dll,可

BornFan的专栏 1210

使用ShellClass获取文件属性详细信息的实现方法

首先引用COM组件Microsoft Shell Controls And Automation这里需要注意DLL的属性Embed Interop Type 设为False否则会引起互操作类型异常代码如下ShellClass sh = new ShellClass();Folder dir = sh.NameSpace(Path.GetDirectoryName(sFile));FolderItem item = dir.ParseName(Path.GetFileName(sFile));string det = dir.GetDetailsOf(item, iCol);iCol 对应文件详

C#互操作性入门系列(一):C#中互操作性介绍

C#互操作系列文章:C#互操作性入门系列(一):C#平台下互操作性介绍C#互操作性入门系列(二):使用平台调用调用Win32 函数C#互操作性入门系列(三):平台调用中的数据封送处理C#互操作性入门系列(四):在C#中调用COM组件本专题概要:引言平台调用C++ Interop(互操作)COM Interop(互操作)一、引言   这个系列是在C#基础知识中遗留下来的一个系列的,因为在C# 4.0...

weixin_34320159的博客 418

Kettle入门指南:从安装到数据转换实战

本文提供Kettle(Pentaho Data Integration)的完整入门指南,涵盖从Java环境安装、软件配置到核心概念(转换与作业)的详细解析。通过实战案例,手把手教你如何将文本文件数据导出到Excel,并连接MySQL数据库进行数据导入,帮助你快速掌握这一强大ETL工具的基本使用,实现高效数据搬运与转换。

weixin_29266647的博客 449

NXP MCU CAN波特率(位时间)配置详解

1. 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。 波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。 我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些: ...

weixin_42967006的博客 9691

namespace名称空间相关用法

名称空间可以嵌套;嵌套的名称空间声明格式如: namespace Tree{ namespace AppleTree{...} }, 可以将变量,函数,类等放在内部的名称空间中,比如int num;然后使用Tree::AppleTree::num来进行访问。嵌套的名称空间可以更方便变量名称的管理。 名称空间可以随时添加;在其它的文件中,可以随时添加,不需要到第一次定义名称空间的文件中添加,使用起来非常方便。 同一名称空间可以相互可见,不需要加作用域解析运算符,但是需要遵守比如包含头文件等其它的可见性策略

weixin_45676294的博客 375

实验四 基于IDEA+SpringBoot+Maven+Thymeleaf的系统实现实验目的

通过这次实验,我学习了如何成功进行IDEA+SpringBoot+maven的系统实现,搭建好IDEA+SpringBoot+maven的系统环境,成功地安装并配置了maven的运行环境,学会了创建springboot的三种方式,并且能将之前的实验结合起来运用。pom.xml中引入thymeleaf依赖,在classpath:/templates/下新建HTML页面(可采用实验一创建的页面),新建controller进行测试,访问页面后返回success成功数据。同时掌握和thymeleaf的基本语法。

m0_73502929的博客 1379

【F#初学者】第二讲 F#中的类型简介

F#中的类型系统 集合类型 可区分联合 常见类型 unit类型 面向对象类型等

scixing的博客 1084

【汽车ECU标定技术解析】DCM文件与A2L、HEX的协同工作机制

本文深入解析了汽车ECU标定中DCM、A2L与HEX三大核心文件的协同工作机制。A2L文件作为定义标定变量地址与规则的“图纸”,DCM文件承载工程师调试后的具体标定数据,最终通过A2L的地址映射,将DCM数据固化生成可刷入ECU的HEX文件,形成完整的标定数据流转闭环。

weixin_29214559的博客 437

C# WinForm上位机:从串口调试工具到智能温控系统(Modbus RTU协议实战+完整源码)

做工业上位机开发时,我们常从串口调试工具入手:验证设备通信、查看数据帧,但面对实际场景(比如温控、电机控制),单纯的“收发数据”远远不够——需要解析工业标准协议(如Modbus RTU)、实时监控关键指标、实现自动化控制逻辑,还要有稳定的UI交互和数据记录。串口调试工具能收发数据,但看不懂Modbus RTU帧(地址、功能码、寄存器、CRC校验);想控制温控设备(如加热器、风扇),但不知道如何通过Modbus写入控制指令;手动调节目标温度时,温度波动大,需要PID算法实现精准控温,但不会集成;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1304

【F#初学者】第一讲 F#简介&&&第一个F#程序

F#初学者系列,介绍了F#的优势和编写了第一个程序

scixing的博客 1128

【即插即用模块】Mamba篇 | CVPR 2025 | MaIR:新型Mamba扫描方式+通道混洗注意力,全任务涨点!

MaIR是一种新型图像恢复模型,通过嵌套S形扫描策略(NSS)和序列混洗注意力(SSA)改进传统Mamba方法。NSS采用条纹区域划分和S形扫描路径,既保留图像局部性又维持空间连续性;SSA通过通道洗牌和门控机制增强特征聚合。该模块创新性地融合多路径选择性扫描、深度卷积和注意力机制,在保持O(N)计算复杂度的同时,显著提升超分辨率和去噪等任务的性能表现(PSNR提升0.2-0.5dB)。代码实现包含特征洗牌、组卷积等关键操作,适用于高分辨率视觉任务,可作为即插即用组件替代传统自注意力模块。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1166

F#版本更新说明

F#CTP 1.9.6.0更正列表:       1、名称空间必须使用完全限定名打开,名称空间不可以取别名。      2、在fs,fsi文件中,除注释外,第一行必须使用#light或#light "off"      3、元组类型互操作上发生了变动。      新增了两个类型来提供互操作上的支持。TupleEnd,TupleNested,彻底解决了互操作上的不一致性。   Code

老吕吐槽 389

2024美团秋招硬件开发笔试真题及答案解析

在 Linux 内核的网络设备驱动中,数据链路层的功能通常由网络协议栈的低层(如以太网驱动)实现,而不是作为网络设备驱动的一个独立层次。在 FreeRTOS 中,任务通知(Task Notifications)是一种轻量级的事件传递机制,用于在任务之间或任务与中断之间传递信号。小美正在开发一个简单的密码生成器,其中一个功能是将输入的字符串中的所有字母按字母顺序循环前移一位(即 'a' 变为 'z','B' 变为 'A',以此类推)。它包含了网络设备的各种参数和方法,用于管理网络设备的初始化、配置和操作。

XU157303764的博客 1676

Python全栈入门到实战【进阶篇 1】类与对象:面向对象编程的基石

Python中定义类使用**class关键字**,创建对象使用**类名()**(类似调用函数),语法简洁,我们从最基础的空类开始,逐步拆解。class# 定义空的学生类,pass表示占位,无实际内容 class Student : pass编码规范:类名遵循大驼峰命名法(每个单词首字母大写,无下划线),如StudentCarPhone,这是Python官方推荐的PEP8规范,便于区分类和其他标识符。实例方法必须定义在类内部;实例方法的第一个参数必须是self(名称可自定义,如this。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3404

F#学习过程中的一点看法

接触F#其实已经很久,因为没有用,也就没有仔细去学,现在在公司的一部分工作也是负责新技术的研究,在弄VS2011过程中发现MVC4中有模型层直接用F#的模板,看来微软有点要实际推F#的感觉,于是决定系统的学习一下F#。下面聊聊这几天学习F#的一些感觉:1)函数式编程其实并不是什么新的玩意,可以看做是一种过程式语言,属于结构化编程,面向过程。这其实也符合我原来对面向过程和面向对象编程的一些看法(可以

三人行必有我师,手写三行必有所悟 3498

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

F#语言的数据可视化

F#作为一种现代编程语言,其在数据可视化过程中的优越性不言而喻。通过结合F#强大的数据处理功能与丰富的可视化库,开发者可以高效地处理和可视化数据。无论是静态数据的分析、还是实时数据的展示,F#都展现了其灵活性和高效性。在未来,随着数据科学领域的发展,F#可能会在更多场景中展示其潜力,尤其是在大数据和机器学习等领域,进一步推动数据可视化技术的进步。希望本文能够为对F#感兴趣的开发者提供一些启示和参考。

2501_90771039的博客 919

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

F#基础篇_(1)F#简介

F#的简介以及开发环境配置

qq_56942034的博客 1912

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

F#教程(一)——————F#语言概述

F#是一种简洁、高效、富于表现性的函数式的及面向对象的程序设计语言。它是基于Ocaml的,而Ocaml是基于ML函数程序设计语言的。F#自2002年开始研发,2005年发布了第一个版本,2007年底正式从研发专案转移至产品部门,并决定将F#置入Visual Studio.NET 2010。截止目前(2009年1月6日现在),最新的F#预览版为F# September 2008 CTP,版本号为

1万+

F#语言的Web开发

F#作为一种函数式编程语言,在Web开发领域展现出其独特的优势。通过使用Giraffe、Saturn等框架,开发者能够快速构建高性能的Web应用。F#强大的类型系统、不可变数据结构和函数式编程特性,使得其在处理中小型项目时具备了很大的灵活性和安全性。虽然F#在生态系统和社区支持上仍然不如其他主流语言成熟,但随着更多开发者认识到它的优势,其在Web开发中的应用势必会越来越广泛。希望本文能为想要学习和使用F#进行Web开发的读者提供一些参考和帮助。

2501_90300675的博客 985

F# 基础

F# 基础 再译《F# 基础》序 前言 第一章     什么是函数编程     函数编程为啥重要     什么是 F#     谁在用F#     谁能读本书 第二章 获得、安装、使用 F# 第三章 函数编程(一)     文字、函数、标识符、标识符的命名、作用域、轻量语法 第三章函数编程(二)     捕获标识符、use

心想事成 3199

[置顶]F#学习之路(5)元组类型

元组类型,表示一组有序数据类型的集合。F#通过支持元组类型,方便了我们定义临时数据结构,而不需要为了临时的数据专门定义一个数据类型。      一、元组的定义:        Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> let tupl

老吕吐槽 481

谁在用F#

谁在用F#?   F# 在微软内部表现就很强劲,不仅在微软研究,而且在整个公司。Ralf Herbrich,微软研究院应用项目组的另一位领导,专门从事机器学习技术,是正在逐步壮大的F# 粉丝中一个铁杆。   “第一个应用是解析110GB 大的日志文件,并将其导入SQL 数据库,这些日志文件分布在300 个目录,超过11000 个文本文件。整个应用程序只有90 行(还包括注释),完成解析源文

心想事成 6241
上一篇: Type Provider - 通过 给一个自定义基类共享信息
下一篇: Window Phone上的F# - 图形计算器
fsharp_net
博客等级 码龄15年 20粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值