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. MLlib 卡方检验

    1.卡方检验理论 1.1.  简介 总体的分布函数完全未知或只知形式.但不知其参数的情况,为了推断总体的某些未知特性,提出某些关于总体的假设.我们要根据样本对所提出的假设作出是接受,还是拒绝的决策.假 ...

  2. 转:用 git 下载 uboot 源码

    1. 起因: 想下载 uboot 源码,原先的方法都是下载压缩包,然后放到虚拟机上的 Ubuntu ,再解压. 在看 uboot 源码的时候,发现 v2016.01 版本的uboot中关于 board ...

  3. windows 2003 远程桌面 连接输入账号密码后,只能看见蓝色屏幕和鼠标

    具体解决方案参考的 http://www.tomshardware.com/forum/171045-46-remote-desktop-connection-blank-desktop   to s ...

  4. android 利用反射机制获取drawable中所有的图片资源

    public List<Map<String,Object>> getGridData() { list=new ArrayList<Map<String,Obje ...

  5. RHEL修改主机名和IP

    1,     修改主机名 vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=NEWHOSTNAME       #修改该值作为主机名,如:NEWPC ...

  6. 替换IMG

    <?php $str = '<img src="http://img01.feiniu.com/images/show/detail/image/20141031/9b3bbc3 ...

  7. CheckBox的触发

    遇到的问题:当Checkbox选中时触发Checked事件,使界面处于状态1,但是页面状态2时也希望checkBox处于选中状态,但是直接修改它的IsChecked属性势必会触发他的Checked事件 ...

  8. Jmeter压力测试环境准备

    Jmeter性能监控 配置好测试机器上的jmeter环境:http://jmeter-plugins.org/downloads/all/ 网站下载两个东西: JMeterPlugins-Standa ...

  9. Android编程之ActivityManager: Segmentation fault

    今天运行代码时,出现了一个不能运行的故障问题:ActivityManager: Segmentation fault 是的,这个原因网上有诸多解释:包名不能是中文或者非法字符,或者重启新的avd来解决 ...

  10. 将16进制颜色转换成UIColor-ios

    -(UIColor *) hexStringToColor: (NSString *) stringToConvert { NSString *cString = [[stringToConvert ...