关于Dll、Com组件、托管dll和非托管dll的理解

C#调用C++非托管DLL:P/Invoke原理、数据封送与性能优化实战 在软件开发中,混合编程是一种常见的技术模式,它允许开发者结合不同编程语言的优势来构建应用。其核心原理在于通过特定的调用机制,在不同运行时环境之间建立通信桥梁。平台调用(P/Invoke)正是.NET框架中实现此目标的关键技术,它使得托管代码能够安全、高效地调用非托管原生函数。这项技术的价值在于,它让开发者能够复用庞大的历史C/C++代码库,同时利用C#的快速开发能力构建用户界面,从而在桌面应用、游戏开发、工业控制和**高性能计算**等领域实现最佳平衡。在实际应用中,开发者常需处理**数据封送**、内存管理和 阅读详情

2015-11-24 10:35 by Lasthelloworld, 1391 阅读, 0 评论, 收藏 , 编辑

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组件【这种方式不推荐,毕竟是淘汰的技术,.net下完成类似的事情已经提供了更好的手段】

Socket底层协议Dll 立即下载

相关推荐

串口通信协议 dll

串口通信协议 dll

Vitesse2Dll服务协议

Vitesse2Dll服务协议 本协议系由Vitesse2Dll开发人员与所有使用Vitesse2Dll服务的主体(包括但不限于个人、团队等)(以下简称“用户”)对Vitesse2Dll服务的使用及相关服务所订立的有效合约。使用Vitesse2Dll服务的任何服务即表示接受本协议的全部条款。本协议适用于任何Vitesse2Dll服务,包括本协议期限内的用户所使用的各项服务和软件的升级和更新。 一

forevermemory的专栏 751

101协议dll源码(C#)

C#编写101协议动态链接库dll,包括遥信 遥测 遥控,及定值参数

托管DLL和非托管DLL的区别

首先解释一下,托管DLL和非托管DLL的区别。狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。      托管DLL文件,可以在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using  DLL命名空间,来调用相应的DLL对象 。     非托管DLL文件,在Dotnet环境应用时

huang9012的专栏 1万+

ROS2_IGH方案配置(二)——Ubuntu22.04 实时内核性能验证与调优

本文详细介绍了在Ubuntu22.04系统上配置ROS2_IGH方案时,如何验证和调优PREEMPT_RT实时内核性能。通过使用cyclictest工具进行基准测试和压力测试,分析中断与硬件延迟,并优化内核参数,确保系统满足工业控制领域对硬实时性的苛刻要求。文章还提供了针对ROS2的特殊优化建议和性能监控方案,帮助开发者实现毫秒级延迟的稳定控制。

weixin_30791095的博客 224

DolphinScheduler任务状态异常排查:从僵尸任务到数据库修复全流程

本文详细介绍了DolphinScheduler中僵尸任务的识别、诊断与修复全流程,包括数据库层面的SQL操作指南、系统恢复验证方法以及预防措施。针对任务状态异常问题,提供了从基础排查到高级源码分析的完整解决方案,帮助运维人员有效管理系统资源和工作流调度。

weixin_27966471的博客 133

C#调用C++的dll两种方法(托管与非托管)

C#调用C++的方式分为两种:(1)非托管的方式进行调用;(2)采用托管的方式进行调用。一、使用非托管类调用C++的dll。1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示5、在dllConsoleApplication1项目上新建一个CPPDLL类,编写以下代码:usingSystem;usingSystem.Collections.Generic;usingSy...

bruce135lee的专栏 5527

Windows版MySQL8.4.2LTS解压直用(下载免安装-绿色-项目打包直接使用-含卸载)

安装前运行微软常用运行库全集(也可能称为依赖)关于MySQL8中相关参数配置,可通过。选择8.5.2LTS长期服务版。选中密码,右键会直接复制。

xzzteach的博客 1440

C++ 封装DLL遇到的一些坑爹问题与解决方案

一.string类型不兼容 这个算是最常见也是最初级的问题了,为了方便跨语言接口调用,如果数据量不是特别大的话,我们可以在封装DLL时选择json串来作为方法的引入参数和返回值,但由于C++的string类型(其实是STL)内存分配器兼容性很滑稽,基本上跨平台调用就一定会出现异常。所以要避免在动态库接口中传递STL容器。 解决方案: 比较常规的方法是使用char *进行指针传递,但同时有会存...

九日王朝 7039

超级详细!!!新手使用AutoDL跑深度学习(MixVPR项目)的学习记录

新手第一次在AutoDL上跑深度学习的实验,遇到一些问题,简单记录一下。如果大家发现问题,欢迎和我讨论。

weixin_45152283的博客 5万+

与rkipc通信

函数名称功能系统模块初始化系统模块反初始化重启恢复出厂设置导出日志导出配置文件导入配置文件系统升级获取用户数设置用户数获取用户权限设置用户权限获取用户名设置用户名获取密码(已加密)设置密码(已加密)新增用户删除用户。

qq_44643189的博客 1612

关于Dll、Com组件、托管dll和非托管dll

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++,

511遇见 8555

LLCE、PFE模块,二层交换/桥接的通用学习转发机制

NXP 文档里给出的正式全称如下:面向 CAN/CAN-FD、LIN、FlexRay 的“低延迟通信引擎”,用多核 M0 固件做报文收发、过滤、路由,把主 CPU 中断负荷降到几乎 0。“数据包转发引擎”,负责以太网帧的分类、修改、转发、VLAN/NAT/IPsec 等 offload,支持 2 Gbit/s 线速且主机负载 ≈0。两者都跑各自固件,通过内部 AXI 桥可互连,实现“CAN→ETH”零主核参与的硬件级网关功能。是它们都集成在。

qq_25461777的博客 1303

C#调用非托管dll文件

C#调用非托管dll文件C#对两种类型动态库的使用1.托管2.非托管C#调用非托管dll一、C++头文件样子解决方案:二、使用DLLImport类三、二次封装为.NET托管dll或者ocx过程参考 C#对两种类型动态库的使用 来自链接:C#对两种类型动态库的使用 1.托管 如果一个动态库本身是基于.NET的,那么可以直接在工程引用里右键添加引用,如微软的COM技术【因为你依托的是微软的框架,所以需要regsvr32注册】 2.非托管 如果不是基于.NEt的,那么需要使用DllImport技术,或者通过MFC

lanshahewu的博客 2528

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 439

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从Qt到C#,通过COM组件达成跨语言跨平台链接,或者说从托管到非托管的思路

从Qt到C#,通过COM组件达成跨语言跨平台链接,或者说从非托管到托管 写在前面 c#真的是一种非常蛋疼的语言,和别的语言兼容性差,界面开发效率也不是很高,但是胜在库功能强大,对windows的兼容好,编译快。但是托管的特性决定了它....就是会非常蛋疼。 这里说下托管与非托管。托管的意思就是指代码是放在.netframework上运行的。 换句话说,就是托管的代码理论上并不会编译成二进制文件,...

Andius的博客 285

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

托管代码调用非托管代码的方式总结

基于.net开发,托管的便利好处自然不用再多言,垃圾回收、内存管理等等,加之强大的FCL类库作支持后盾,一般情况下我们都不会直接用到非托管代码,一些常用的底层api都已经被FCL类库进行了很好的封装,我们只需要知道用到哪一个类即可。 但是类库虽然强大,却非万能的,总有一些基于底层的api没有被封装,或者说程序要调用一些第三方的接口,一般都是c/c++的dll。就我本人所知,许多地区的医疗保险接口便都是非托管代码,如c++写的。 在这种情况之下,我们便要考虑到托管代码对于非托管代码的调用问题了,这种技术称

Learn_change_myself的博客 1579

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32F407中文手册

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

对c#托管代码和非托管代码的理解与使用

托管DLL和非托管DLL的区别 概念: 简单来讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件(用C\C++编译的代码)。 用法: 托管DLL文件,可以在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using DLL命 名空间,来调用相应的DLL对象 。 非托管DLL文件,在Dotnet环境应用时,通过DllImport调用。 为什么有的dll需要注册而有的不需要注册? 因为有的是com...

qq_34458421的博客 356

ASP.NET与非托管DLL的那些事儿【转+增】

https://www.cnblogs.com/yeahgis/archive/2011/11/12/2246341.html ASP.NET与非托管DLL的那些事儿 环境VS2010 语言:ISO C++、C++\CLI和C# 多语言集成编程 最近在用ASP.NET(C#)开发一个WMS服务器的原型,由于标准C++开发的dll无法直接被C#引用,因此...

weixin_30478757的博客 262

22、探索托管与非托管代码的互操作性:深入解析

本文深入探讨了托管代码与非托管代码之间的互操作性,重点介绍了运行时可调用包装器(RCW)、COM可调用包装器(CCW)以及平台调用服务(PInvoke)的应用。通过具体示例展示了如何在托管环境中调用COM组件和Win32 API,以及如何从非托管代码调用托管组件。同时,文章还讨论了内存管理、异常处理、性能优化及安全性等关键概念,并结合Web、桌面和移动应用程序的实际应用场景进行了分析。

weixin_35294091的博客 1114

.net组件和com组件&托管代码和非托管代码

com组件和.net组件: COM组件是非托管对象,可以不需要.NET框架而直接运行,.NET框架组件是托管对象,必须有.NET框架的支撑才能运行。 COM组件有独立的类型库文件,而.NET组件是通过使用程序集清单来进行自我引用 COM组件基于接口进行通信,而.NET组件直接通信,不通过中间接口查询COM组件必须在注册表中注册DUID项,.NET组件却不需任何手工注册COM组件没次可以而...

weixin_33701294的博客 277

C#通过DllImport引入dll中的C++非托管类

首先从msdn了解到,DllImport是用来将特性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。从以上语句我们可以理解出三点:1.C++编写的非托管dll可以通过DllImport引入到C#中;2.引入到C#中的只能是C++方法(或者说函数),而不能是数据(或者说变量);3.引入到C#中后只能声明为静态函数;msdn关于DllImport属性类的链接:http://msdn.micr...

bruce135lee的专栏 2475

实现托管代码调用非托管代码以及非托管代码调用托管代码->COM Interop

代码下载位置: CLRInsideOut2007_01.exe (1480 KB) Browse the Code Online 目录 一个简单的 ATL COM 服务器 创建一个 COM 客户端 使用 Tlbimp 转换 COM DLL 编写一个托管客户端 封送一个结构和一个字符串 在托管代码中使用 P/Invoke 使用接口调用托管代码 调试托管代码和非托管代码 总结 C...

weixin_30634661的博客 313
上一篇: 【转】托管代码和非托管代码的区别
下一篇: 浅析C#中的Attribute
hongyanjava
博客等级 码龄17年 12粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值