创建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 ...
随机推荐
- 转: pthread_detach()函数
创建一个线程默认的状态是joinable. 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码). 所以创建线程者应该调 ...
- Linux学习——卸载Ubuntu,安装CentOS,第一次使用命令
最近,看了相关的资料,发现Ubuntu不是很利于学习Linux操作系统,而CentOS比较有利于学习Linux操作系统,就卸载了. 当然,对于菜鸟,自然是很没有主见. 卸载Ubuntu感觉很奇怪,下来 ...
- ASP.NET Web.Config 读资料 (学习笔记)
refer : http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html 上面这篇写很好了. 在做项目时,我们经常会遇到一些资料,我 ...
- linux grep shell相关
http://blog.csdn.net/buutterfly/article/details/6615162 http://www.2cto.com/os/201307/224496.html ht ...
- COJ 0557 4013多重部分和问题
4013多重部分和问题 难度级别:B: 运行时间限制:2000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 n种大小不同的数字 Ai,每种各Mi个,判断是否可以从 ...
- cf581C Developing Skills
Petya loves computer games. Finally a game that he's been waiting for so long came out! The main cha ...
- Activity — 4 launch mode
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task ...
- fzu1759:数论高次幂降幂
题目大意: 求 a^b mod c的值..但是b会非常大(10^1000000) 所以需要用到一个数论公式: A^x = A^(x % Phi(C) + Phi(C)) (mod C) 证明见ac大神 ...
- Java 8 默认方法和多继承深入解析
以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implements)多个接口,但是接口中只有抽象方法, ...
- UUID详解
什么是UUID? UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符.UUID具有以下涵义: 经由一定的算法 ...