青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

C++調用C#的COM(轉載)



轉自:http://www.codeproject.com/csharp/ManagedCOM.asp

Preface

COM Interoperability is the feature of Microsoft .NET that allows managed .NET code to interact with unmanaged code using Microsoft's Component Object Model semantics.

This article is geared towards C# programmers who are familiar with developing COM components and familiar with the concept of an interface. I'll review some background on COM, explain how C# interacts with COM, and then show how to design .NET components to smoothly interact with COM.

For those die-hard COM experts, there will be some things in this article that are oversimplified, but the concepts, as presented, are the important points to know for those developers supplementing their COM code with .NET components.

Introduction

.NET Interfaces and Classes

The basis for accessing .NET objects either from other .NET code or from unmanaged code is the Class. A .NET class represents the encapsulation of the functionality (methods and properties) that the programmer wants to expose to other code. A .NET interface is the abstract declaration of the methods and properties that classes which implement the interface are expected to provide in their implementations. Declaring a .NET interface doesn't generate any code, and a .NET interface is not callable directly. But any class which implements ("inherits") the interface must provide the code that implements each of the methods and properties declared in the interface definition.

Microsoft realized that the very first version of .NET needed a way to work with the existing Windows technology used to develop applications over the past 8+ years: COM. With that in mind, Microsoft added support in the .NET runtime for interoperating with COM - simply called "COM Interop". The support goes both ways: .NET code can call COM components, and COM code can call .NET components.

Using the code

Steps to create a Managed .NET C# COM Object:

  1. Open VS.NET2003->New Project->Visual C# Projects->Class Library.
  2. Project name: MyInterop.
  3. Create MyDoNetClass.cs file, and add the following lines of code:
    using System.Runtime.InteropServices;
                    using System.Windows.Forms;
  4. Create an Interface IMyDotNetInterface.
  5. Create a class MyDoNetClass.
  6. Add the following line for MyDotNetClass:
    [ClassInterface(ClassInterfaceType.None)]

Although a .NET class is not directly invokable from unmanaged code, Microsoft has provided the capability of wrapping a .NET interface in an unmanaged layer of code that exposes the methods and properties of the .NET class as if the class were a COM object. There are two requirements for making a .NET class visible to unmanaged code as a COM object:

Requirement 1:

You have to add GUIDs - Globally Unique Identifiers - into your code for the interface and the class separately, through a GUID tool.

  1. Now, create a GUID for the Interface, and add the following line for the interface:
    [Guid("03AD5D2D-2AFD-439f-8713-A4EC0705B4D9")]
  2. Now, create a GUID for the class, and add the following line for the class:
    [Guid("0490E147-F2D2-4909-A4B8-3533D2F264D0")]
  3. Your code will look like:
    using System;
                    using System.Runtime.InteropServices;
                    using System.Windows.Forms;
                    namespace MyInterop
                    {
                    [Guid("03AD5D2D-2AFD-439f-8713-A4EC0705B4D9")]
                    interface IMyDotNetInterface
                    {
                    void ShowCOMDialog();
                    }
                    [ClassInterface(ClassInterfaceType.None)]
                    [Guid("0490E147-F2D2-4909-A4B8-3533D2F264D0")]
                    class MyDotNetClass : IMyDotNetInterface
                    {
                    // Need a public default constructor for COM Interop.
                    public MyDotNetClass()
                    {}
                    public void ShowCOMDialog()
                    {
                    System.Windows.Forms.MessageBox.Show(“I am a" +
                    "  Managed DotNET C# COM Object Dialog”);
                    }
                    }
                    }
  4. Compile the solution.
  5. You will see inside the project directory->obj->debug directory, the file “MyInterop.dll” generated after compilation.

Requirement 2:

Registration of the COM Class and Interfaces

For a COM class to be accessible by the client at runtime, the COM infrastructure must know how to locate the code that implements the COM class. COM doesn't know about .NET classes, but .NET provides a general "surrogate" DLL - mscoree.dll -- which acts as the wrapper and intermediary between the COM client and the .NET class.

  1. Hard-code a specific version number in your AssemblyVersion attribute in the AssemblyInfo.cs file which is in your project.

    Example:

    [assembly: AssemblyVersion("1.0.0.0")]
  2. Create a strong-name key pair for your assembly and point to it via the AssemblyKeyFile attribute in the AssemblyInfo.cs file which is in your project. Example:
    sn -k TestKeyPair.snk
    [assembly: AssemblyKeyFile("TestKeyPair.snk")]
  3. Add your assembly to the GAC using the following command:
    gacutil /i MyInterop.dll
  4. Register your assembly for COM by using the REGASM command along with the "/tlb" option to generate a COM type library.
    REGASM MyInterop.dll /tlb:com.MyInterop.tlb
  5. Close the C# project.

Steps to create an Unmanaged C++ application to call a .NET Managed C# COM

  1. Open VS.NET2003->New Project->Visual C++ Projects->Win32->Win32 Console Project.
  2. Name: DotNet_COM_Call.
  3. Include the following line in your DoNet_COM_Call.cpp file:
    #import “<Full Path>\com.MyInterop.tlb" named_guids raw_interfaces_only
  4. Compile the solution.
  5. It will generate a “com.myinterop.tlh” file into your project->debug directory.
  6. You can open this file and see the contents. This is basically the proxy code of the C# COM code.
  7. Now, you can write the code to call the .NET Managed COM.
  8. Please add the following lines of code before calling the COM exported functions:
    CoInitialize(NULL);   //Initialize all COM Components
                    // <namespace>::<InterfaceName>
                    MyInterop::IMyDotNetInterfacePtr pDotNetCOMPtr;
                    // CreateInstance parameters
                    // e.g. CreateInstance (<namespace::CLSID_<ClassName>)
                    HRESULT hRes =
                    pDotNetCOMPtr.CreateInstance(MyInterop::CLSID_MyDotNetClass);
                    if (hRes == S_OK)
                    {
                    BSTR str;
                    pDotNetCOMPtr->ShowCOMDialog ();
                    //call .NET COM exported function ShowDialog ()
                    }
                    CoUninitialize ();   //DeInitialize all COM Components
  9. Run this console application.
  10. Expected result: a managed code (C# ) dialog should appear with the string “I am a Managed DotNET C# COM Object Dialog”.

Points of Interest

While creating an Interface for COM exported functions, creating GUIDs for the Interface and the class and registering the class are required steps, and doing all this is always interesting and fun. Calling parameterized exported functions also is very interesting.

About Atul Mani


Atul Mani Tripathi has been a professional developer since 1997 and working as a senior consultant with Cognizant Technology Solutions (CTS) .

Most of the time, his focus is on creating a clean and simple solution to development problems. He is a C++, Visual C++ and C# (Dot NET) guy who loves Visual Studio, Google, Code Project and developing personal projects.

posted on 2007-05-30 22:46 夢在天涯 閱讀(10778) 評論(2)  編輯 收藏 引用 所屬分類: CPlusPlus

評論

# re: C++調用C#的COM(轉載) 2007-06-05 09:21 夢在天涯

可以參考msdn:http://msdn2.microsoft.com/zh-cn/library/2w30w8zx(VS.80).aspx  回復  更多評論   

# re: C++調用C#的COM(轉載)[未登錄] 2013-08-20 15:58 super

How about COM event?  回復  更多評論   

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811737
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲综合不卡| 亚洲性图久久| 欧美88av| 欧美大片一区| 亚洲一区二区视频| 亚洲一区二区三区在线看 | 一本色道久久综合亚洲精品高清| 欧美伦理影院| 欧美影院久久久| 久久久999精品免费| 亚洲日本成人在线观看| 中文精品在线| 在线不卡免费欧美| 91久久久一线二线三线品牌| 欧美日韩视频专区在线播放| 欧美一激情一区二区三区| 欧美自拍偷拍| 一区二区三区色| 欧美一区二区黄| 亚洲最新合集| 欧美在线视频在线播放完整版免费观看 | 欧美成人精品在线| 亚洲免费中文| 欧美成人视屏| 久久精品色图| 欧美四级电影网站| 久久综合影视| 国产伦精品一区二区三区照片91| 欧美成人免费视频| 国产精品自拍小视频| 亚洲国产经典视频| 国产综合激情| 亚洲一二三区在线| 亚洲毛片在线| 久久青草欧美一区二区三区| 亚洲桃色在线一区| 欧美成人蜜桃| 另类av导航| 国产女主播视频一区二区| 亚洲精品你懂的| 国产亚洲精久久久久久| 夜夜嗨一区二区| 9人人澡人人爽人人精品| 久久久噜噜噜久噜久久| 欧美在线视频观看| 国产精品二区在线| 亚洲片在线资源| 亚洲欧洲精品一区二区三区波多野1战4 | 一本色道88久久加勒比精品| 亚洲黄色大片| 久久亚洲视频| 久久久久久久一区二区三区| 欧美日韩一区二区三区免费看| 久久大香伊蕉在人线观看热2| 欧美精品一区二区三区在线看午夜| 欧美专区日韩专区| 国产精品福利片| 日韩亚洲欧美一区| 亚洲欧洲日本专区| 久久综合久久综合九色| 久久青草福利网站| 国产一区白浆| 欧美制服丝袜| 久久久www成人免费无遮挡大片 | 午夜精品一区二区三区四区| 亚洲一区三区在线观看| 欧美日韩1区| 9国产精品视频| 午夜一区二区三区不卡视频| 国产精品亚洲成人| 欧美一区二区播放| 猛男gaygay欧美视频| 亚洲国产激情| 欧美日韩日日骚| 亚洲欧美国产毛片在线| 久久久国产91| 亚洲国产老妈| 欧美日韩免费精品| 亚洲永久免费视频| 久久这里有精品15一区二区三区| 亚洲大片精品永久免费| 蜜桃久久精品乱码一区二区| 亚洲人体1000| 欧美影院视频| 亚洲欧洲精品一区| 国产精品久久久久久久久免费 | 亚洲精品国产精品久久清纯直播| 夜夜嗨av色综合久久久综合网| 国产精品www.| 久久久久免费视频| 亚洲精品久久久久| 久久狠狠婷婷| 亚洲精品日韩精品| 国产精品外国| 欧美大片免费久久精品三p| 在线视频你懂得一区二区三区| 久久午夜电影| 亚洲网站视频| 影音先锋久久资源网| 欧美日韩八区| 久久人人爽人人爽| 亚洲午夜精品久久久久久app| 久久亚洲欧洲| 亚洲欧美日韩精品久久| 亚洲电影av| 国产伦精品一区二区三区高清| 欧美α欧美αv大片| 亚洲在线不卡| 亚洲麻豆视频| 男人的天堂亚洲| 欧美一区二区三区的| 亚洲精品在线免费| 狠狠色狠色综合曰曰| 欧美视频一区二区三区在线观看| 久久久久国色av免费观看性色| 一区二区三区久久网| 亚洲第一视频| 免费日韩av片| 久久精品亚洲一区二区| 亚洲一卡二卡三卡四卡五卡| 亚洲国产精品女人久久久| 国产美女一区二区| 国产精品二区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 先锋亚洲精品| 亚洲性xxxx| 一区二区av| 亚洲人成在线播放| 亚洲高清久久网| 一区免费在线| 一区二区三区亚洲| 狠狠久久五月精品中文字幕| 国产日韩精品视频一区二区三区| 国产精品国产三级国产普通话三级 | 一本色道久久综合亚洲精品高清| 亚洲国产精品成人精品| 欧美ed2k| 欧美高清视频| 亚洲国产片色| 亚洲日本在线观看| 99re国产精品| 一区二区欧美在线观看| 一区二区三区高清视频在线观看| 一个色综合导航| 制服诱惑一区二区| 亚洲制服少妇| 欧美亚洲自偷自偷| 久久久水蜜桃| 欧美大片在线观看| 欧美另类极品videosbest最新版本| 欧美精品大片| 国产精品国产馆在线真实露脸| 国产精品日韩久久久| 国产欧美一区二区三区久久 | 亚洲国产视频一区二区| 亚洲国产天堂网精品网站| 亚洲精品久久久久久久久久久久 | 欧美成人一区二区| 亚洲国产成人精品久久| 亚洲精品乱码久久久久| 亚洲图片欧美一区| 久久成人久久爱| 欧美成人资源| 国产精品黄色在线观看| 国产一区二区日韩精品| 亚洲人被黑人高潮完整版| 一区二区欧美精品| 久久精品国产亚洲a| 欧美福利视频一区| 99香蕉国产精品偷在线观看| 香蕉精品999视频一区二区| 久久男人资源视频| 欧美日韩一级大片网址| 国产三级欧美三级| 亚洲精品一品区二品区三品区| 亚洲欧美电影院| 免费成人高清视频| av成人免费在线观看| 久久国内精品视频| 欧美日韩1区2区| 极品中文字幕一区| 亚洲视频国产视频| 免费影视亚洲| 亚洲综合国产精品| 欧美第一黄色网| 国产一区二区三区最好精华液| 日韩亚洲视频在线| 久久激情视频久久| 日韩小视频在线观看专区| 久久久久免费观看| 国产精品一级在线| 日韩视频亚洲视频| 美女国内精品自产拍在线播放| 一本色道久久综合| 欧美风情在线| 亚洲福利免费| 麻豆久久久9性大片| 亚洲欧美日本视频在线观看| 欧美另类极品videosbest最新版本| 在线观看亚洲一区|