关于Dll、Com组件、托管dll和非托管dll
转自:https://blog.csdn.net/black_bad1993/article/details/53906252
Com组件

1.线程模型是干嘛用的?
解决”多个线程”“同时”调用你的COM组件的并发控制。客户没有你的COM的源代码,它不知道你的组件是怎么写的,是不是线程安全的(是否用CriticalSection或Mutex保护了临界资源),所以要有一种机制来声明组件的线程安全性,你开发时指定了组件的线程模型,客户端一看,哦,它就知道该怎么写调用的代码。
2.啥时候用操心线程模型?
全看客户端是单线程还是多线程,单线程不用操心,怎么调都没事,多线程就来事了,跨线程调用时就要考虑。
3.线程模型的一堆概念都是哪跟哪啊?
首先一分为二:客户端和组件。客户端用CoInitializeEx进入一种套间,Apartment、Free是指的客户端进入的套间种类;组件要向注册表写入自己兼容什么样的客户端套间,是Apartment,还是Free,还是两种都兼容(Both)。
4.客户端的线程套间和组件的不一致了咋办,难道我调个COM组件还得查注册表看看兼容什么线程模型?
不一致时以组件为主。客户端建的是Apartment,组件兼容Free,那COM背地里会在客户端建一个Free套间,把组件放进去。反之,会建一个Apartment套间把组件放进去。总之以组件为主,这是关键,只有这样,你才不用关心组件的线程安全性,COM服务替你在后台办妥了。
5.听说过列集这个名词,是什么啊,啥时候用?
记死了,跨线程调用组件就得列集,没的商量。传出接口的线程列集,使用接口的线程散列。列集说白了就是不让你直接调用组件的接口,而是调用接口的代理。COM服务在中间插一杠子,干啥,实现COM线程安全那一揽子事呗,它不拦截你的调用它怎么实现啊,所以就给你个代理,所以就列集了呗。
内容来源:https://www.cxybb.com/article/crybird/80808960
COM最酷的一点是,允许把本地的RPC转化成In-Process Procedure Call(进程内过程调用)。这点极大地优化了性能,而且使得COM成为了有史以来最强的RPC方案
Com组件和dll区别:
1.普通dll不能通过regsvr32.exe来注册,而Com组件能通过regsvr32.exe注册。
2.Com组件是微软的一个协议,满足com组件协议的dll文件就是com组件,这种协议为了跨语言、跨平台使用,dll组件需要编译后使用,而Com组件注册后即可使用。
而dll是动态链接库,是一个可以导出函数的集合。
3.Com组件可以是exe也可以是dll文件。
托管dll/Com组件和非托管dll/Com组件:
1.非托管Com组件是用非运行库代码编写的,如C++,用C#编写的Com组件为托管Com组件,托管Com组件是用.netFramwork运行库编写的。
2.COM组件是以前微软推荐的;
COM组件是非托管对象,可以不需要.net框架而直接运行。
.NET组件是现在微软推荐的;
.NET组件是托管对象,必须有.net框架才能运行。
托管dll和非托管dll调用方式:
托管dll:Assembly ass = Assembly.LoadFile(dllPath);加载,
非托管: [DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);调用
疑问:
托管的dll一定是Com组件吗?
错:托管dll只能说是使用运行库代码编写的dll文件,并非一定是Com组件。
非托管的dll一定不是Com组件吗?
错:只用满足Com协议的就是Com组件,与编写的语言无关。
C#调用dll方式与是否是Com组件无关?
对:托管dll,目标代码是C#,使用: Assembly ass = Assembly.LoadFile(dllPath);加载,
非托管dll,目标代码VB6,C++,使用:
[DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);调用
C:\Windows\Microsoft.NET\Framework\v4.0.30319
注册Com组件的两种方式:
RegAsm.exe:托管注册,使用NET自带工具用来注册COM Interop,.NET下注册Com组件的工具,注册表允许COM 客户程序以透明方式创建.NET
Framework类。
regsvr32.exe:非托管注册,这是用于注册的COM DLL,也可以理解用于注册非托管代码控件注册为Com组件。
补充说明:
运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。
NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。公共语言运行库是 .NET Framework 的基础。
c#写的Com组件编译为符合.net标准托管类库,添加了COM Interop 层代码。(C#写的com组件需要注册后使用,COM当然还是非托管的,但是c#写的托管代码是可以通过 COM
接口来调用的。)
E:\DllDemo\DllDemo\DllDemo\bin\Debug:
应用:
C#调用外部Com组件:
步骤1:先判断是否是Com组件,使用regasm.exe和regsvr32.exe注册方式判断是否能注册(使用RegAsm.exe注意高版本能注册低版本,低版本不能注册高版本)
步骤2:判断是托管Com组件还是非托管Com组件。
步骤3:托管Com组件使用用, Assembly ass = Assembly.LoadFile(dllPath);
非托管使用
[DllImport("Kernel32.dll")]private static extern IntPtr LoadLibrary(string path);调用
其他网友的补充:
DLL:这个只是程序打包的表现形式,是早期windows为了解决代码公用而使用的一种技术,这个库文件只能被调用运行到一个执行文件进程中
COM:主要是为了解决二进制程序间的公用的技术,既可以使用独立进程COM服务,如Office的COM模型,其他程序可以任意调用;也可以是DLL的形式,运行时需要依赖执行进程,相比DLL有很大的优越性,都是基于接口和系列的规范进行,一定程度上解决了DLL的版本问题
如上在.net时代前,主要是C/C++进行编写
托管:这个是后来微软推出.net后,有了.net虚拟环境,因此所有的程序都叫做托管了
托管COM:进入.net时代后,微软以前的COM技术有大量的历史遗留软件,因此为了兼容,必然就有这个托管的COM问题,主要涉及2个方面:托管程序和历史的COM交互[interop];另外也可以使用C#等托管语言实现COM组件
关于Dll、Com组件、托管dll和非托管dll的更多相关文章
- 如何让IntPtr指向一块内存,以及托管内存与非托管内存的相互转化
IntPtr idp= IntPtr.Zero; StringBuilder idata = new StringBuilder("000000"); string idata = ...
- C# using 三种使用方式 C#中托管与非托管 C#托管资源和非托管资源区别
1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. ...
- C# 托管资源和非托管资源
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
- [转]在C#中使用托管资源和非托管资源的区别,以及怎样手动释放非托管资源:
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
- C# 托管资源与非托管资源
在.net 编程环境中,系统的资源分为托管资源和非托管资源. 托管资源: Net平台中,CLR为程序员提供了一种很好的内存管理机制,使得程序员在编写代码时不要显式的去释放自己使用的内存资源(这些在先前 ...
- C# 托管内存与非托管内存之间的转换
c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存 ...
- .net 资源释放(托管资源和非托管资源)
1.托管资源 像int.float.DateTime等都是托管资源:net中80%的资源都是托管资源: 托管资源的回收通过GC(垃圾回收器)自动释放分配给该对象的内存,但无法预测进行垃圾回收的时间,我 ...
- Azure 托管镜像和非托管镜像对比
目前中国区 Azure 也已经可以使用命令制作托管镜像了.但对于托管镜像和非托管镜像,就像托管磁盘和非托管磁盘一样,很多人可能一开始无法理解.这里就此进行了一个简单对比: 通过对比测试,这里总结了这两 ...
- C# 托管资源 与 非托管资源
C# 托管资源 与 非托管资源 托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,.NET可以自动进行回收,主要是指托管堆上分配的内存资源.例如程序中分配的对象,作用域内的变量 ...
- .net托管资源与非托管资源
在项目当中用到的资源分为托管资源和非托管资源,托管资源无非就是什么int.string.datatime之类,托管资源不需要人为去管理,.net framework中有专门针对托管资源的管理机制(GC ...
随机推荐
- .Net Core中自定义认证实现
一.起因 最近项目中需要对项目同时支持JWT认证,以及自定义的认证校验方式认证.通过对官方文档了解,得到认证实现主要通过继承IAuthenticationHandler 或 Authenticatio ...
- 002 Linux 文件与目录命令的必会姿势!
01这些命令真的很重要吗? 文件及目录的路径切换.显示.创建.复制.移动和删除操作的常用姿势,必会!因为这些命令是使用 Linux 系统进行工作的基础,是摆脱小白的第一步,是构建大厦的基石! 发现锅锅 ...
- 【Vulnhub靶场】JANGOW: 1.0.1
时隔这么久,终于开始做题了 环境准备 下载靶机,导入到virtualBox里面,这应该不用教了吧 开机可以看到,他已经给出了靶机的IP地址,就不用我们自己去探测了 攻击机IP地址为:192.168.2 ...
- MySQL运维开发之路
MySql h1 { color: rgba(0, 60, 128, 1); text-align: center } h1:hover { color: rgba(0, 255, 111, 1) } ...
- 这个命令行HTTP客户端工具真不错
程序员专属微信红包封面1000个,兑换码:dWK7fUs2WQG cURL相信很多做开发的.运维的都不陌生,是非常有用的一个终端请求工具,借助于它可以在命令行中进行HTTP.FTP等请求,在Linux ...
- 一 简单介绍aws。
aws入门 一 什么是aws? /* 概念: AWS就是 Amazon Web Servies, 亚马逊云计算服务平台. 是一款云服务. */ 二 aws可以做什么? // 可以在aws,创建我们需要 ...
- ApacheCN Vue 译文集 20211115 更新
使用 GraphQL 构建 VueJS 应用 零.前言 一.数据绑定.事件和计算属性 二.组件.混合器和功能组件 三.设置我们的聊天应用--AWS Amplify 环境和 GraphQL 四.创建自定 ...
- Java线程--Phaser使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867895.html Java线程--Phaser使用, 代码里头有详细注释: packag ...
- squid 代理服务器应用
squid 代理服务器应用 1.Squid 代理服务器 : Squid 主要提供缓存加速.应用层过滤控制的功能. 代理的工作机制: 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址. 将获得 ...
- 【HDU6647】Bracket Sequences on Tree(树Hash 树上Dp)
题目链接 大意 给出一颗树,按下列方式生成一个括号序列. function dfs(int cur, int parent): print('(') for all nxt that cur is a ...