创建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 ...
随机推荐
- Linux编译错误集
1.编译驱动: FATAL: modpost: GPL-incompatible module ArmGpioDriver.ko uses GPL-only symbol 'class_destroy ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- java——Arrays.asList()方法
Arrays.asList() 是将数组作为列表 问题来源于: public class Test { public static void main(String[] args) { int[] a ...
- JS点击按钮弹出窗口
由于没有系统学习过JS,遇到一个需求:点击按钮,弹出一个独立的窗口. 在网上百度了一下,并没有找到满意的结果,最重要的是各种方法很复杂.最终,仔细研究了一下,原来只是需要只要一个简单的函数就能满足自己 ...
- tcp/ip连接
1.TCP先连接(三次握手) client -> server : SYN a server -> client :SYN b, ack a+1 client -> server a ...
- lesson1:压测普通网页
本文展示了利用jmeter来压力测试普通网页,具体步骤如下: 1.添加[线程组]“lesson1压测普通网页”,“线程数”设置为10:“循环测试“设置为50,如图所示: 2.添加一个"htt ...
- IOS-UITableView开发常用各种方法总结
实现列表有两种方式 方式一 继承UIViewController,实现UITableViewDataSource和UITableViewDelegate协议.声明UITableView. UserIn ...
- SpringMVC+highstock实现曲线报表
最近项目要做曲线报表,之前用的是生成图片然后传到前端,感觉不是很好,在网上找到资料说highstock就可以而且还可以做类似股票的那种实时的曲线,研究的一段时间把项目问题解决了做个总结: 首先把hig ...
- 自定义listView添加滑动删除功能
今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...
- CSU1659: Graph Center(最短路)
Description The center of a graph is the set of all vertices of minimum eccentricity, that is, the s ...