创建C#DLL
1. 创建classlibrary
2.编写一个COM接口和一个COM类
[Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")]
public interface IManagedInterface
{ int PrintHi(string name); }
[Guid("C6659361-1625-4746-931C-36014B146679")]
public class InterfaceImplementation : IManagedInterface
{ public int PrintHi(string name) { Console.WriteLine("Hello, {0}!", name); return 33; } }
3.在PROJECT上点击右键,选择属性---》bulid,选择registry from com interep.
4.一定要以管理员的方式运行 VS
5.在BIN里面有dll。可以不用 CSC 那种命令行了,happy.
6.怎么在C#中引用 :
添加引用
using System.Runtime.InteropServices;
using ClassLibrary2;
[DllImport("ClassLibrary2.dll", SetLastError = true)]
public static extern int DoWork(bool flags);
ClassLibrary2.Class1 c1 = new Class1();
B1.Content =c1.DoWork(true);
7. 如果是要发布给c++,那就对不起了,还有好多步骤。
7.1请添加以下属性
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("6EEF31AA-4D8B-4BE6-9254-F9C971E80BAB")]
public interface IF1
{
[DispId(1)]
int DoWork(bool user);
}
[ProgId("ClassLibrary2.DotNet")]
[ClassInterface(ClassInterfaceType.None)]
[Guid("51B24524-2B52-4EDB-89FF-B9F2A3BB8B44")]
7.2
请在debug中运行sn -k TestKeyPair.snk
AssemblyInfo.cs中
[assembly: ComVisible(true)]
[assembly: AssemblyKeyFile("TestKeyPair.snk")]
7.3
gacutil /i MyInterop.dll
REGASM MyInterop.dll /tlb:com.MyInterop.tlb
Register your assembly for COM by using the REGASM command along with the "/tlb" option to generate a COM type library.
8在c++项目中
#import "<>\\com.ClassLibrary2.tlb" named_guids raw_interfaces_only
build
9在c++项目中
#pragma comment(lib,"<>\\com.ClassLibrary2.tlh")
10 请找到uuid号码,用CoCreateInstance得到实例
CoInitialize(NULL); //Initialize all COM Components
HRESULT hr = CoInitialize(NULL);
CLSID clsid = __uuidof(ClassLibrary2::ClassLibrary2);
IID iid = __uuidof(ClassLibrary2::IF1);
11:
ClassLibrary2::IF1 *ptr;
hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,__uuidof(ClassLibrary2::IF1), (LPVOID*)&ptr);
long * rs;
rs = (long *)malloc(sizeof(long)* 1);
ptr->DoWork(true, rs);
CoUninitialize();
或者12:
IClassFactory * p_classfactory;
hr = CoGetClassObject(clsid, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory,(LPVOID*)&p_classfactory);
ClassLibrary2::IF1 *ptr2; p_classfactory->CreateInstance(NULL, __uuidof(ClassLibrary2::IF1), (LPVOID*)&ptr2);
ptr2->DoWork(true, rs);
其实还有13:
CComPtr
但是这个是VC++专属类
#include <atlbase.h>
CComPtr<ClassLibrary2::IF1> ptr3;
ptr3.CoCreateInstance(clsid);
http://www.codeproject.com/Articles/12673/Calling-Managed-NET-C-COM-Objects-from-Unmanaged-C
http://www.myexception.cn/vc-mfc/145728.html
创建C#DLL的更多相关文章
- 在Visual Studio 2010 中创建类库(dll)
创建类库 选择"文件"->新建->项目->Visual C# ->类库,输入名称,选择位置,单击确定 浏览解决方案资源管理器,可以看到两个C#类,第一个是A ...
- C++创建动态链接库(*.dll)
1. 从 “文件”菜单中,选择 “新建”,然后选择 “项目…”. 2. 在“项目类型”窗格中,选择“Visual C++”下的“Win32”. 3. 在“模板”窗格中,选 ...
- MFC创建动态链接库DLL并调用方法详解
实例一: 1.创建一个动态链接库工程,如login_dll. 2.在原工程头文件或者新建头文件如showdlg.h定义动态链接库的导出函数,代码如下: #include "stdafx.h& ...
- 在vs2013下手把手创建/调用dll
body { font: 16px } 参考了大佬的文章 首先,体会一下静态编译: 创建Win32Project,选DLL,添加一个.h和.cpp文件 点击生成解决方案,然后去debug目录下拷贝.l ...
- VS2010创建动态链接库(DLL)的方法
1.第一步创建WIN32项目,选择DLL 2.第二步,创建你自己的DLL CPP文件和头文件,下面以两个简单的加减法函数为例子导出 然后编译生成即可.DLL文件在Debug或Release目录中 .d ...
- RookeyFrame Bug 线上创建的DLL被删除了 模块无法删除 临时解决
不知道什么情况 在线创建模块,DLL被删除了,但是模块的相关数据无法删除.可以按照下面的方法临时用一下. 产生这个的原因,好像是Config里面的NeedInit一直都是true,没有改为false, ...
- VS2019 C++动态链接库的创建使用(1) - 创建使用dll
静态库:函数和数据被编译进一个二进制文件,通常扩展名为.lib,在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件. ...
- 其它 用VB6创建ActiveX.dll
1.打开VB6 2.选择 ActiveX DLL,点击打开 3.在窗口输入测试代码 Public Function addstr(str As String) As String addstr = & ...
- 创建win32 dll 空项目
动态库,多字节 win32 空项目 添加导出头文件 类 导入: #pragma once #ifndef IP_CLASS_DLL_H #define IP_CLASS_DLL_H #pragma ...
随机推荐
- 转:memcpy的用法总结
1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...
- Largest product in a series
这个我开始理解错了,算错了. 我以为是求连续5个数的最大值,结果,是连接5个数相乘的最大值. 英语不好,容易吃亏啊. Find the greatest product of five consecu ...
- USB 0xC0000012 错误详解
0xC0000012Bus Hound 6.01 capture on Windows Vista Service Pack 1 (x86). Complements of www.perisoft. ...
- Yii创建前台和后台登录表单和通过扩展 CWebUser 增加信息到 Yii::app()->user
我参考了这篇文章来构建项目的前台和后台的目录结构.感谢Andy的这篇文章.按照所有的步骤,您将有单独的前台和后台面板,如: http://localhost/index.php // 前台 http: ...
- Linux企业级项目实践之网络爬虫(26)——线程池
一旦有一个抓取请求开始,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出.这就是"即时创建,即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但 ...
- linux 切换用户之后变成-bash-x.x$的解决方法
我们平时在linux下切换用户后命令行为什么会变成-bash-3.2$呢,我们来分析一下,这就是跟linux的机制有关联了,因为在linux下每次通过useradd创建新的用户时,都会将所有的配置文件 ...
- 【转】asp.net mvc webapi+angular.js案例
参考地址:http://www.mamicode.com/info-detail-892383.html 大家好,本文用一个简单的demo演示AngularJS在MVC中的使用,在学习这个demo之前 ...
- XAMPP的MYSQL无法启动
昨天用各种方式试验MYSQL的数据库备份与恢复操作,恢复过程中,MYSQL就无法启动了. 提示如下: 22:59:43 [mysql] Attempting to start MySQL app... ...
- js 等待刷新技术
- swift菜鸟入门视频教程-04-集合类型
本人自己录制的swift菜鸟入门,欢迎大家拍砖,有什么问题能够在这里留言. 主要内容: 数组(Arrays) 字典(Dictionaries) 集合的可变性(Mutability of Collect ...