COM Interop 允許 COM 開發人員像訪問其他 COM 對象一樣輕松訪問托管代碼。本教程說明如何將 C# 服務器與 C++ COM 客戶端一起使用。它還解釋了下列活動:
該教程還簡要說明了在托管和非托管組件之間自動應用的封送處理。
COM Interop 第一部分:C# 客戶端教程顯示使用 C# 與 COM 對象交互操作的基礎知識,這是該教程的前提。有關兩個教程的概述,請參見 COM Interop 教程。
該教程說明下列創建 C# 服務器的活動:
該教程還說明下列創建 COM 客戶端的活動:
注意 若要為導出到 COM 客戶端的接口和 coclass 創建 GUID,請使用 Guidgen.exe 工具,此工具是作為 Visual Studio 的一部分交付的。Guidgen 使您可以選擇 GUID 的表示格式,這樣您就不必重新鍵入它。有關 Guidgen 的更多信息,請參見知識庫文章 Q168318“XADM: Guidgen.exe Available Only for Intel Platforms”。知識庫文章可以在 MSDN Library 中以及 Web 站點 http://support.microsoft.com 上找到。
本示例由兩個文件組成:
// CSharpServer.cs // compile with: /target:library // post-build command: regasm CSharpServer.dll /tlb:CSharpServer.tlb using System; using System.Runtime.InteropServices; namespace CSharpServer { // Since the .NET Framework interface and coclass have to behave as // COM objects, we have to give them guids. [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; } } }
// COMClient.cpp // Build with "cl COMClient.cpp" // arguments: friend #include <windows.h> #include <stdio.h> #pragma warning (disable: 4278) // To use managed-code servers like the C# server, // we have to import the common language runtime: #import <mscorlib.tlb> raw_interfaces_only // For simplicity, we ignore the server namespace and use named guids: #if defined (USINGPROJECTSYSTEM) #import "..\RegisterCSharpServerAndExportTLB\CSharpServer.tlb" no_namespace named_guids #else // Compiling from the command line, all files in the same directory #import "CSharpServer.tlb" no_namespace named_guids #endif int main(int argc, char* argv[]) { IManagedInterface *cpi = NULL; int retval = 1; // Initialize COM and create an instance of the InterfaceImplementation class: CoInitialize(NULL); HRESULT hr = CoCreateInstance(CLSID_InterfaceImplementation, NULL, CLSCTX_INPROC_SERVER, IID_IManagedInterface, reinterpret_cast<void**>(&cpi)); if (FAILED(hr)) { printf("Couldn't create the instance!... 0x%x\n", hr); } else { if (argc > 1) { printf("Calling function.\n"); fflush(stdout);[1] [2] 下一頁
// The variable cpi now holds an interface pointer // to the managed interface. // If you are on an OS that uses ASCII characters at the // command prompt, notice that the ASCII characters are // automatically marshaled to Unicode for the C# code. if (cpi->PrintHi(argv[1]) == 33) retval = 0; printf("Returned from function.\n"); } else printf ("Usage: COMClient <name>\n"); cpi->Release(); cpi = NULL; } // Be a good citizen and clean up COM: CoUninitialize(); return retval; }
可以用以下命令行調用可執行客戶端:COMClient <name>
,其中 <name>
表示要使用的任何字符串,如 COMClient friend
。
Calling function. Hello, friend! Returned from function.
在示例 IDE 項目中,將項目“屬性頁”中的“命令行參數”屬性設置為需要的字符串(例如,“friend”)。
上一頁 [1] [2]