文章編號: 828736 - 上次校閱: 2007年4月19日 - 版次: 2.6

如何從原生 Visual C++ 程式碼在 Visual Studio.NET 中,或在 Visual Studio 2005 中呼叫 Managed 的 DLL

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將逐步告訴您,如何從原生 C + + 程式碼呼叫受管理的 DLL。執行這項操作,使用 Microsoft Visual C#.NET 或 Microsoft Visual C# 2005,建立簡單的 Managed 的 DLL 並然後從原生 C + + 程式碼中呼叫此受管理的 DLL。

需求

本文假設您已熟悉下列主題:
  • 撰寫元件物件模型 (COM) 用戶端
  • Microsoft.NET Framework 中的 COM 互通性

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Visual C#.NET 或 Visual C# 2005
  • Visual C++.NET 或 Visual C++ 2005

撰寫 Managed 的 DLL

若要建立簡單的 Managed 的 DLL 具有公用方法以新增兩個數字並傳回結果,請依照下列步驟執行:
  1. 啟動 Microsoft Visual Studio.NET 或 Microsoft Visual Studio 2005。
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。[新增專案] 對話方塊隨即開啟。
  3. 在 [專案類型 下, 按一下 [Visual C# 專案]。

    附註在 Visual 的 Studio 2005 按一下 Visual C#專案類型] 下。
  4. 在 [範本 下, 按一下 類別程式庫
  5. 在 [名稱] 文字方塊中輸入 sManagedDLL,],然後再按一下 [確定]]。
  6. 在程式碼] 檢視中開啟 Class1.cs 檔案。
  7. 若要宣告有方法來加入兩個數字的公用介面,加入下列程式碼到 Class1.cs file:
    // Interface declaration.
    public interface ICalculator
    {
        int Add(int Number1, int Number2);
    };
  8. 若要在類別中實作這個公用介面,將下列程式碼加入至 Class1.cs file:
    // Interface implementation.
    public class ManagedClass:ICalculator
    {
        public int Add(int Number1,int Number2)
            {
                return Number1+Number2;
            }
    }
  9. 按一下 [開始],然後再指向 [程式集
  10. 如果您使用的 Microsoft Visual Studio.NET 2003年,指向 Microsoft Visual Studio.NET 2003年,然後再指向 [Visual Studio.NET 工具。如果您使用的 Microsoft Visual Studio.NET 2002年,指向 Microsoft Visual Studio.NET,然後指向 [Visual Studio.NET 工具。如果您使用的 Visual Studio 2005,指向 Microsoft Visual Studio 2005,然後再指向 [Visual Studio 2005 工具
  11. 如果您使用的 Visual Studio.NET 2003年,按一下 [Visual Studio.NET 2003年命令提示字元 開啟 Visual Studio.NET 命令提示字元]。如果您使用 Visual Studio.NET 2002年,請按一下 Visual Studio.NET 命令提示字元 開啟 Visual Studio.NET 命令提示字元。如果您使用的 Visual Studio 2005,按一下 [Visual Studio 2005 命令提示 以開啟 Visual Studio 2005 命令提示字元]。
  12. 若要建立您的類別庫的強式名稱,在 Visual Studio.NET 命令提示字元中輸入下列命令:
    sn.exe k MyKeyFile.SNK
  13. 將 MyKeyFile.SNK 檔案複製到您的專案資料夾。
  14. 按兩下 AssemblyInfo.cs 檔案以在方案總管] 中開啟該檔案。
  15. 取代下列程式碼中 [AssemblyInfo.cs 檔案
    [assembly: ComVisible(false)]
    [assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile("")]
    與下列
    [assembly: ComVisible(true)] 
    [assembly: AssemblyDelaySign(false)] 
    [assembly: AssemblyKeyFile("..\\..\\MyKeyFile.SNK")]
  16. 按下 CTRL + SHIFT + B 可產生 Managed 的 DLL。

註冊使用 Managed 的 DLL 與 COM 或原生 C + +

若要使用 COM 或原生 C + + 中,請使用 Managed 的 DLL,您必須 Windows 登錄中註冊您的 DLL 的組件資訊。要這麼做,請您執行下列步驟:
  1. 按一下 [開始],然後再指向 [程式集
  2. 如果您使用的 Microsoft Visual Studio.NET 2003年,指向 Microsoft Visual Studio.NET 2003年,然後再指向 [Visual Studio.NET 工具。如果您使用的 Microsoft Visual Studio.NET 2002年,指向 Microsoft Visual Studio.NET,然後指向 [Visual Studio.NET 工具。 如果您使用 Visual Studio 2005,指向 Microsoft Visual Studio 2005,然後指向 [Visual Studio 2005 工具
  3. 如果您使用的 Visual Studio.NET 2003年,按一下 [Visual Studio.NET 2003年命令提示字元 開啟 Visual Studio.NET 命令提示字元]。如果您使用 Visual Studio.NET 2002年,請按一下 Visual Studio.NET 命令提示字元 開啟 Visual Studio.NET 命令提示字元。 如果您使用的 Visual Studio 2005,按一下 [Visual Studio 2005 命令提示 以開啟 Visual Studio 2005 命令提示字元]。
  4. 在 [Visual Studio.NET 或 Visual Studio 2005] 命令變更包含 Managed 的 DLL 之目錄的目錄路徑。
  5. 在 Windows 登錄中註冊組件資訊的 Managed DLL,並建立對應的型別程式庫,請在 Visual Studio.NET 命令提示字元中執行下列命令:
    RegAsm.exe ManagedDLL.dll /tlb:ManagedDLL.tlb / 程式碼基底

從原生 C + + 程式碼呼叫受管理的 DLL

若要呼叫您剛才從原生 C + + 建立的 Managed 的 DLL 程式碼,請依照下列步驟執行:
  1. 啟動 Visual Studio.NET 或 Visual Studio 2005。
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  3. 如果您使用 Visual C++.NET 2003年,按一下 [專案類型 下的 [Visual C++ 專案,然後按一下 [範本] 下方的 [Win32 主控台專案。如果您使用 Visual C++.NET 2002年,按一下 [專案類型 下的 [Visual C++ 專案,然後按一下 [範本] 下方的 [Win32 專案。如果您使用 Visual C++ 2005年,按一下 [專案類型,] 下的 [Visual C++,然後按一下 [範本] 下方的 [Win32 專案
  4. 在 [名稱] 文字方塊中輸入 CPPClient,],然後再按一下 [確定]]。
  5. 如果您使用的 Visual C++.NET 2003年或 Visual C++ 2005年,按一下 [完成]。如果您使用的 Visual C++.NET 2002年,請按一下 [應用程式設定,按一下 [主控台應用程式,然後再按一下 [完成
  6. 在程式碼] 檢視中開啟 CPPClient.cpp 檔案。
  7. 若要匯入 RegAsm.exe 會產生型別程式庫,加入下列程式碼來 CPPClient.cpp file:
    // Import the type library.
    #import "..\ManagedDLL\bin\Debug\ManagedDLL.tlb" raw_interfaces_only
    變更型別程式庫路徑,如果您的電腦上路徑不同於此路徑。
  8. 若要宣告要使用命名空間,將下列的程式碼加入至 CPPClient.cpp 檔:
    using namespace ManagedDLL;
  9. 若要呼叫 Managed 的 DLL,將下列程式碼加入至 _tmain 函式:
    // Initialize COM.
    HRESULT hr = CoInitialize(NULL);
    
    // Create the interface pointer.
    ICalculatorPtr pICalc(__uuidof(ManagedClass));
    
    long lResult = 0;
    
    // Call the Add method.
    pICalc->Add(5, 10, &lResult);
    
    wprintf(L"The result is %d", lResult);
    
    // Uninitialize COM.
    CoUninitialize();
    return 0;
  10. 按下 CTRL + F5 執行應用程式。

完成程式碼程式碼範例

受管理的 DLL
// Class1.cs
// A simple managed DLL that contains a method to add two numbers.
using System;

namespace ManagedDLL
{
	// Interface declaration.
    public interface ICalculator
    {
        int Add(int Number1, int Number2);
    };

    // Interface implementation.
	public class ManagedClass:ICalculator
	{
       public int Add(int Number1,int Number2)
            {
                return Number1+Number2;
            }
	}
}
C + + 用戶端
// CPPClient.cpp: Defines the entry point for the console application.
// C++ client that calls a managed DLL.

#include "stdafx.h"
#include "tchar.h"
// Import the type library.

#import "..\ManagedDLL\bin\Debug\ManagedDLL.tlb" raw_interfaces_only
using namespace ManagedDLL;
int _tmain(int argc, _TCHAR* argv[])
{
    // Initialize COM.
    HRESULT hr = CoInitialize(NULL);

    // Create the interface pointer.
    ICalculatorPtr pICalc(__uuidof(ManagedClass));

    long lResult = 0;

    // Call the Add method.
    pICalc->Add(5, 10, &lResult);

    wprintf(L"The result is %d\n", lResult);


    // Uninitialize COM.
    CoUninitialize();
    return 0;
}
附註 您必須加入通用語言執行階段支援編譯器選項 (/ clr:oldSyntax) 來順利編譯這個程式碼範例的 Visual C++ 2005年中。 要這麼做,請您執行下列步驟:
  1. 按一下 [專案],然後再按一下 [ProjectName 內容

    附註ProjectName 代表專案的名稱。
  2. 展開 [組態屬性,] 然後按一下 [一般
  3. 按一下以選取 通用語言執行階段支援、 舊語法 (/ clr:oldSyntax)通用語言執行階段支援 專案上的設定右窗格,按一下 [套用],],然後再按一下 [確定]
如通用語言執行階段的相關資訊支援編譯器選項,請造訪下列 Microsoft 網站]:
/ clr (通用語言執行階段編譯)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx (http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx)

?考

如需有關公開.NET Framework 元件 COM,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) Web 網站:
http://msdn2.microsoft.com/en-us/library/zsfww439(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/zsfww439(vs.71).aspx)

這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 標準版
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Service Pack 5
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
關鍵字:?
kbmt kbmanaged kbcominterop kbhowtomaster KB828736 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:828736? (http://support.microsoft.com/kb/828736/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。