创建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 ...
随机推荐
- BroadcastReceiver 案例
BroadcastReceiver 可以接收来自系统和应用的广播,他的生命周期非常简单,只是从对象开始调用他到运行onReceiver方法之后就结束了.要想使用BroadcastReceiver和使用 ...
- RAW碰到的问题与功能的测试
碰到的问题太多: 1. 没人告诉我,应该在CreateFile之前,先InstallDriver2. 签名死活不行(好像是反斜杠问题)3. 注册码错误4. 怀疑ANSI与Unicode注册码的问题5. ...
- c#—— Task.FromResult 的使用
Task.FromResult用来创建一个带返回值的.已完成的Task. 场景一:以同步的方式实现一个异步接口方法 比如有一个接口包含异步方法. interface IMyInterface { Ta ...
- Linux企业级项目实践之网络爬虫(27)——多路IO复用
与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程. 主要应用: (1)客户程序需要同时处理交互式的输入和服务器之间的网络连接 (2) ...
- linux内核链表的移植与使用
一. Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...
- poj2114 Boatherds
Description Boatherds Inc. is a sailing company operating in the country of Trabantustan and offerin ...
- 新博客——That
很久没写博客了,打算换个地方重新开始. 旧博客地址如下: http://blog.csdn.net/that163
- 如何解决ajax跨域问题
如何解决ajax跨域问题(转) 由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题 ...
- Scala-数组
package com.mengyao.scala.function /** * Scala中数组的声明和使用(定长数组和变长数组) * * @author mengyao */object Tes ...
- 简单Mysql思维导图