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. Android 开源框架ActionBarSherlock初探

    1:我的开发环境是Ubuntu12.04下:adt-bundle-linux-x86-20130729. ActionBarSherlock下载地址:http://actionbarsherlock. ...

  2. QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)

    这里讨论的只是Windows平台上的实现. 在QT中绘制异形窗口,只要设定 windowFlag 为 CustomizeWindowHint,再结合setMask()就可以做出各种奇形怪状的窗口.相对 ...

  3. nginx对比haproxy 的反向代理

    -bash-4.1# ip add | grep inet inet 172.17.0.7/16 scope global eth0 inet6 fe80::42:acff:fe11:7/64 sco ...

  4. 2014-07-31 ASP.NET的母版页使用

    今天是在吾索实习的第17天.我在这天主要负责系统的骨架的搭建.首当其冲,要用的知识点就是ASP.NET母版页的使用了. ASP.NET的母版页有两种:一种是MasterPage,最常用也是最普通的母版 ...

  5. HDOJ 1330 Deck(叠木块-物理题啊!贪心算法用到了一点)

    Problem Description A single playing card can be placed on a table, carefully, so that the short edg ...

  6. Java & Android Interviews #1

    1.GC是什么? 为什么要有GC?GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供 ...

  7. Scala-数组

    package com.mengyao.scala.function /** * Scala中数组的声明和使用(定长数组和变长数组) *  * @author mengyao */object Tes ...

  8. JS-Date日期内置对象

    1.基本用法 <script> var date = new Date(); document.write(date+"<br/>");//获取具体时间 d ...

  9. 【转】ASP.NET MVC框架下使用MVVM模式-KnockOutJS+JQ模板例子

    KnockOutJS学习系列----(一) 好几个月没去写博客了,最近也是因为项目紧张,不过这个不是借口,J. 很多时候可能是因为事情一多,然后没法静下来心来去写点东西,学点东西. 也很抱歉,突然看到 ...

  10. Loadrunner结果分析Graphs

    Transactions(用户事务分析)----用户事务分析是站在用户角度进行的基础性能分析. Transation Sunmmary(事务综述)----对事务进行综合分析是性能分析的第一步,通过分析 ...