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

得到\\com.ClassLibrary2.tlh

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的更多相关文章

  1. 在Visual Studio 2010 中创建类库(dll)

    创建类库 选择"文件"->新建->项目->Visual C# ->类库,输入名称,选择位置,单击确定 浏览解决方案资源管理器,可以看到两个C#类,第一个是A ...

  2. C++创建动态链接库(*.dll)

    1.      从 “文件”菜单中,选择 “新建”,然后选择 “项目…”. 2.      在“项目类型”窗格中,选择“Visual C++”下的“Win32”. 3.      在“模板”窗格中,选 ...

  3. MFC创建动态链接库DLL并调用方法详解

    实例一: 1.创建一个动态链接库工程,如login_dll. 2.在原工程头文件或者新建头文件如showdlg.h定义动态链接库的导出函数,代码如下: #include "stdafx.h& ...

  4. 在vs2013下手把手创建/调用dll

    body { font: 16px } 参考了大佬的文章 首先,体会一下静态编译: 创建Win32Project,选DLL,添加一个.h和.cpp文件 点击生成解决方案,然后去debug目录下拷贝.l ...

  5. VS2010创建动态链接库(DLL)的方法

    1.第一步创建WIN32项目,选择DLL 2.第二步,创建你自己的DLL CPP文件和头文件,下面以两个简单的加减法函数为例子导出 然后编译生成即可.DLL文件在Debug或Release目录中 .d ...

  6. RookeyFrame Bug 线上创建的DLL被删除了 模块无法删除 临时解决

    不知道什么情况 在线创建模块,DLL被删除了,但是模块的相关数据无法删除.可以按照下面的方法临时用一下. 产生这个的原因,好像是Config里面的NeedInit一直都是true,没有改为false, ...

  7. VS2019 C++动态链接库的创建使用(1) - 创建使用dll

    静态库:函数和数据被编译进一个二进制文件,通常扩展名为.lib,在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件. ...

  8. 其它 用VB6创建ActiveX.dll

    1.打开VB6 2.选择 ActiveX DLL,点击打开 3.在窗口输入测试代码 Public Function addstr(str As String) As String addstr = & ...

  9. 创建win32 dll 空项目

    动态库,多字节 win32 空项目 添加导出头文件  类 导入: #pragma once #ifndef IP_CLASS_DLL_H #define IP_CLASS_DLL_H #pragma ...

随机推荐

  1. C#控制生成图片的大小

    private void button1_Click(object sender, EventArgs e) { using (Bitmap bitmap = new Bitmap("d:\ ...

  2. IBM总裁郭士纳总结的四类人

    IBM总裁郭士纳总结的四类人, 您属于哪一种呢-欢迎就此话题发表评论 积极采取行动促使事件发生的人 被动接受所发生事件的人 对事件持旁观者心态的人 什么事都不关心的人

  3. CAD2014启动出现loadlibrary failed with error 87

    系统win8.1 x64 安装AutoCAD2014完成后,启动出现:Loadlibrary failed with error 87:参数错误 重启,重装都没用.查了一晚上,在国外网站上找到解决办法 ...

  4. office web apps server 问题和解决办法

    New-OfficeWebAppsFarm –InternalURL "http://owa.zjkhlib.com" –AllowHttp –EditingEnabled 错误1 ...

  5. jquery next nextAll nextUntil siblings的区别

    next:紧挨着$('')的一个元素 nextAll:在$('')以后的所有的同辈元素 nextUntil:until有直到...之前的意思,所以他表示$('')以后的所有的同辈元素,不过要在next ...

  6. Java语言实现简单FTP软件------>上传下载队列窗口的实现(七)

    1.首先看一下队列窗口的界面 2.看一下上传队列窗口的界面 3.看一下下载队列窗口的界面 4.队列窗口的实现 package com.oyp.ftp.panel.queue; import stati ...

  7. SQL Server 系统时间

    getdate()函数:取得系统当前的日期和时间.返回值为datetime类型的. 用法:getdate() 例子: select getdate() as dte,dateadd(day,-1,ge ...

  8. 分布式内存对象缓存 memcached

    分布式内存对象缓存 许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示.但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库响应恶化,网站显示延迟等 ...

  9. 前端input选中状态时的蓝框

    input标签在选中状态时,我们的浏览器不同时,会有不同效果. 一般我们chrome时可能会没有这个效果,但是如果是safari时,这个效果就... 这时为了达到效果统一,我们不得不去掉这个蓝框,就要 ...

  10. CornerStone 破解 最简单的破解方法

    方法一:最近在用cornerstone这个svn的软件感觉非常不错,但是竟然忘了破解,以至于到了14天试用期的最后一天才开始破解, 其实方法很简单,就是修高试用期的天数,找到plist文件把14天改为 ...