文章編號: 307713 - 上次校閱: 2003年4月24日 - 版次: 1.4

如何: 使用 Visual C#.NET 書寫 COM 互通的自訂封送處理器

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

在此頁中

全部展開 | 全部摺疊

結論

本文將告訴您,如何建立自訂的封送處理器所對應特定的 Unmanaged 的介面至 Managed 介面,反之亦然。在本文中實作自訂封送處理器允許原生的用戶端,藉由公開原生的用戶端瞭解在 Unmanaged 的介面看到任何受管理的伺服器。而且,自訂封送處理器會允許以查看由 COM 伺服器,為 Managed 介面公開的介面 Managed 原生元件物件模型 (COM) 伺服器的用戶端。

Back to the top

其他相關資訊

本文將告訴您,需要自訂封送處理器的位置內容。本文提供兩個不同的案例。

案例 1

第一個案例討論自訂封送處理來自.NET 用戶端到 COM 伺服器。在這種情況下,您必須具備:
  • 會實作 [IUnmanagedServer 的 COM 伺服器介面。
  • 若要 IUnmanagedServer 具有名為 UnmanagedServerMethod 的單一方法。此方法需要單一參數的型別 IUnmanaged 做為輸入。
  • 有的執行個體的.NET 用戶端輸入 IManaged。
  • .NET 用戶端將 IManaged 執行個體傳遞 UnmanagedServerMethod 的 COM 伺服器。
遵循程式碼範例是 [IUnmanaged 摘錄介面:
interface IUnmanaged : IUnknown
{
	HRESULT UnmanagedMethod([out, retval] LONG *RetVal);
};
語意上類似於 Unmanaged 介面 (IUnmanaged) 的受管理的介面 (IManaged) 是:
public interface IManaged
{
	long ManagedMethod();
}

案例 2

第二個案例討論自訂封送處理從 COM 用戶端到.NET 伺服器。在這種情況下,您必須具備:
  • .NET 伺服器,實作名為 ManagedServerMethod 的單一方法。此方法需要單一參數的型別 IManaged 做為輸入。
  • 有的執行個體的 COM 用戶端輸入 IUnmanaged。
  • 將 IUnmanaged 執行個體傳遞至 ManagedServerMethod.NET 伺服器的一個 COM 用戶端。
當想對應不同語意上類似的型別必須建立包裝函式類別。包裝函式類別擁有一個型別的執行個體,但公開介面的另一個型別。使包裝函式類別可以維護為介面所定義的語意,則會對應的型別必須類似。本文將告訴您,如何使用包裝函式類別分析藍本的.NET 用戶端存取 COM 伺服器的位置。名為 ManagedIUnmanaged 的包裝函式類別包裝 IManaged 的執行個體,但會公開 IUnmanaged 介面。

同樣的當 COM 用戶端存取.NET 伺服器,名為 ComUnmanged 的包裝函式類別包裝 IUnmanaged 的執行個體,但會公開 IManaged 介面。

將受管理的介面對應至 Unmanaged 介面的問題有解決方案。解決方案是使用包裝函式類別。自訂封送處理器會自動執行,並隱藏為從 umanaged 到受管理的網域,反之亦然封送處理型別建立包裝函式時。

查看 資料流 類別及 IStream COM 介面。您可以看到所需的轉換機制。轉換機制可允許不受管理的物件用來實作特定必須對應至包裝函式物件的介面需求。然後該包裝函式物件會公開一組不同的介面。在.NET 資料流 類別是語意上類似於 IStream COM 介面。資料流 類別和 IStream COM 介面中所提供的抽象概念很類似。IStream 和 資料流 都允許讀取、 寫入,和搜尋上一個緩衝區。可接受的 資料流 類別執行個體的.NET 類別可以以邏輯方式傳遞 COM 物件,它會實作 IStream 介面執行的個體。若要執行此動作.NET Framework 必須提供一個機制,可以建立 資料流 類別的一個包裝函式物件。這再重新導向 資料流 類別方法的呼叫內嵌的 IStream COM 物件。允許到發生轉換的機制是 CustomMarshaler 類別中.NET Framework 所提供。

在這兩個案例中自訂封送處理器會建構執行封送處理方向而定。如果封送處理從原生的用戶端執行到受管理的伺服器,您必須定義自訂封送處理器來封送處理從原生到受管理網域。如果封送自訂封送處理處理兩個方向,然後您必須合併自訂封送處理器的定義這兩種案例中所述。

Back to the top

自訂封送處理來自.NET 用戶端到 COM 伺服器

建立 ATL COM 伺服器的步驟

本節顯示如何建立實作 IUnmanagedServer 介面的 ATL COM 伺服器。
  1. 開啟 Microsoft Visual Studio.NET
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  3. 在 [新增專案] 對話方塊按一下 [專案類型] 下的 [Visual C++ 專案,然後按一下 [範本] 下方的 [ATL 專案]。
  4. 在 [名稱] 文字方塊中,輸入 ComServer
  5. 按一下 [確定]
  6. 在 [精靈] 對話方塊按一下 [應用程式設定] 索引標籤。
  7. 按一下以清除 [使用屬性] 核取方塊然後按一下 [完成]
  8. 在 [方案總管]ComServer (專案) 節點上按一下滑鼠右鍵,並指向 [新增,然後按一下 [加入類別
  9. 加入類別] 對話方塊在 [範本] 下按一下 [ATL 簡單物件],然後按一下 [開啟舊檔]。
  10. 在 [ATL 簡單物件精靈] 對話方塊在 [簡短名稱] 文字方塊中輸入 UnmanagedServer,然後按一下 [完成]
  11. 在 [方案總管],展開 原始程式檔
  12. 連按兩下 ComServer.idl 在編輯器中開啟.idl 檔案。將下列的介面定義加入至
    [
    	object,
    	uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
    	helpstring("IUnmanaged Interface"),
    	pointer_default(unique)
    ]
    interface IUnmanaged : IUnknown
    {
    	HRESULT UnmanagedMethod([out, retval] LONG *RetVal);
    };
    取代 uuid 屬性的內容為從 guidgen 工具產生的 GUID。.idl 檔。在程式庫加入 IUnmanaged 介面,先前的程式碼所示。這會公開透過型別程式庫產生的介面。將下列程式碼加入至.idl 檔中 程式庫 陳述式:
    library ComServerLib
    {
    	importlib("stdole2.tlb");
    	//Add the following line to the idl file.
    	interface IUnmanaged;
    	...
    };
    
  13. 類別 檢視中展開 ComServer
  14. IUnmanagedServer] 上按一下滑鼠右鍵,指向 [新增],然後再按一下 [加入方法
  15. 方法名稱] 文字方塊中,輸入 UnmanagedServerMethod
  16. 按一下以選取 [參數屬性] 核取方塊。
  17. 在 [參數型別] 下拉式方塊輸入 IUnmanaged *
  18. 在 [參數] 文字方塊中輸入 不受管理],然後按一下 [新增]。
  19. 按一下 [完成]。
  20. 在 [方案總管],按兩下 UnmanagedServer.cpp
  21. 取代為下列程式碼具有 [CUnmanagedServer::UnmanagedServerMethod 方法產生的預設程式碼:
    LONG data;
    HRESULT hr;
    hr = unmanaged->UnmanagedMethod(&data);
    if(FAILED(hr))
    	return hr;
    printf("The output of the IUnmanaged::UnmanagedMethod is : %d", data);
    return S_OK;
  22. 在 [建置] 功能表上按一下 建置方案 建置 ATL COM 伺服器應用程式。
Back to the top

建立.NET 用戶端的步驟

本節顯示如何建立.NET 用戶端存取 COM 伺服器,並傳遞 UnmanagedMethod 伺服器與 IManaged 執行個體的:
  1. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  2. 在 [新增專案] 對話方塊按一下 [專案類型] 下的 [Visual C# 專案,然後再按一下 [範本] 下方的 [主控台應用程式
  3. 按一下以選取 [加入至方案] 選項,然後再按一下 [確定]
  4. 在 [方案總管],展開 ConsoleApplication1、 以滑鼠右鍵按一下 [參考],然後按一下 [加入參考]。
  5. 在 [加入參考] 對話方塊按一下 [COM] 索引標籤。
  6. 按一下 元件名稱] 下的 ComServer 1.0 型別程式庫,然後按一下 [選取]。
  7. 按一下 [確定]
  8. Class1.cs 在預設程式碼取代下列程式碼:
    using System;
    using System.Runtime.InteropServices;
    
    public interface IManaged
    {
    	long ManagedMethod();
    }
    
    public class ManagedImplementation : IManaged
    {
    	public long ManagedMethod()
    	{
    		return 200;
    	}
    }
    
    class Class1
    {
    	static void Main(string[] args)	
    	{
    		comserverLib.IUnmanagedServer server = new comserverLib.UnmanagedServerClass();
    		IManaged managed = new ManagedImplementation();
    		server.UnmanagedServerMethod(managed);
    	}
    }
    
Back to the top

建立包裝函式的步驟

本節會示範如何建立一個包裝 IManaged 型別的執行個體,但會公開 IUnmanaged 介面的包裝函式類別。

若要建立包裝函式類別,請依照下列步驟執行:
  1. 加入程式碼遵循 Class1.cs:
    [
    	ComImport,
    	Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
    	InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)
    ]
    public interface UCOMIUnmanaged
    {
    	long UnmanagedMethod();
    }
    
    public class ManagedIUnmanaged : UCOMIUnmanaged
    {
    	IManaged managedObj;
    
    	public ManagedIUnmanaged(IManaged managedObj)
    	{
    		if(managedObj != null)
    			this.managedObj = managedObj;
    		else
    			throw new ArgumentNullException("The instance of IManaged is null.");
    	}
    
    	public long UnmanagedMethod()
    	{
    		return  managedObj.ManagedMethod();
    	}
    }
    
    uuid 屬性的內容取代 Guid 屬性內容。 Null。uuid 屬性產生來供 IUnmanaged 介面 ComServer.idl 檔案中。

Back to the top

建立自訂的封送處理器的步驟

本節會示範如何建立將 Managed 的介面 (IManaged) 對應到不受管理的介面 (IUnmanaged) 的自訂封送處理器:

自訂封送處理器必須實作 ICustomMarshaler 介面。 當未受管理的介面對應到 Managed 介面時,會呼叫 MarshalNativeToManaged 方法。因為到原生網域從 Managed 封送處理目前的分析藍本,MarshalNativeToManaged 方法目前的實作會傳回 null。MarshalManagedToNative 方法換行包裝函式物件 (ManagedIUnmanaged) 已在前一節中定義原生的物件。受管理的介面對應至 Unmanaged 介面時,會呼叫 MarshalManagedToNative 方法。原生介面相關聯的物件被釋出時,會呼叫 CleanUpNativeData 方法。

同樣地,Managed 介面相關聯的物件被釋出時,會呼叫 CleanUpManagedData 方法。因為 Managed 的物件回收 CleanUpManagedData 方法的實作是空的。

GetNativeDataSize 方法會傳回 -1

雖然 GetInstance 方法不定義為 ICustomMarshaler 介面,您必須定義 GetInstance 靜態方法會傳回 ICustomMarshaler 的執行個體。若要建立自訂封送處理器的執行個體之.NET 執行階段會呼叫這個靜態方法。
  1. Add the code that follows to Class1.cs:
    public class SampleMarshaler : ICustomMarshaler
    {
    	static SampleMarshaler marshaler;
    
    	public object MarshalNativeToManaged(IntPtr pNativeData)
    	{
    		return null;
    	}
    	
    	public IntPtr MarshalManagedToNative(object managedObj)
    	{
    		if(managedObj == null)
    			return IntPtr.Zero;
    		if(!(managedObj is IManaged))
    			throw new MarshalDirectiveException("This custom marshaler must be used on a IManaged derived type.");
    
    	ManagedIUnmanaged customObject = new ManagedIUnmanaged((IManaged)managedObj);
    	return Marshal.GetComInterfaceForObject(customObject, typeof(UCOMIUnmanaged));
    	}
    
    	public void CleanUpNativeData(IntPtr pNativeData)
    	{
    		Marshal.Release(pNativeData);
    	}
    
    	public void CleanUpManagedData(object managedObj)
    	{
    
    	}
    
    	public int GetNativeDataSize()
    	{
    		return -1;
    	}
    
    	public static ICustomMarshaler GetInstance(string cookie)
    	{
    		if(marshaler == null)
    			return marshaler = new SampleMarshaler();
    		return marshaler;
    	}
    }
  2. 關聯自訂封送處理器 IManaged IUnmanaged 介面的執行個體的介面執行個體的封送處理。 加入程式碼後面 Class1.cs 關聯自訂封送處理器的:
    [
    	ComImport,
    	Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
    	InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)
    ]
    public interface UCOMIUnmanagedServer
    {
    	void UnmanagedServerMethod(
    		[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(SampleMarshaler)), In]
    		object unmanaged);
    }
    您使用 Guid 屬性指定的 [Guid 是 uuid 屬性指定給 IUnmanagedServer 介面中 COM 伺服器的.idl 一樣。
  3. 修改 Main 方法的 類別 1 中 Class1.cs 如下:
    static void Main(string[] args)
    {
    	UCOMIUnmanagedServer server = (UCOMIUnmanagedServer)new ComServerLib.UnmanagedServerClass();
    	IManaged managed = new ManagedImplementation();
    	server.UnmanagedServerMethod(managed);
    }
    時不受管理的用戶端呼叫 Unmanaged 的伺服器,Unmanaged 用戶端會將 Managed 物件的執行個體傳遞至 Unmanaged 伺服器。受管理的物件是自訂封送處理至物件,如預期般由 COM 伺服器公開 Unmanaged 的介面。
  4. 在 [建置] 功能表上按一下 建置方案
  5. 在 [方案總管]ConsoleApplication1 專案節點上按一下滑鼠右鍵,然後按一下 [設定為啟始專案]。
  6. 在 [偵錯] 功能表上按一下 [開始]。
Back to the top

自訂封送處理從 COM 用戶端到.NET 伺服器

下面示範如何自訂封送處理的案例執行從 COM 用戶端.NET 伺服器。

建立 COM 用戶端的步驟

本節顯示如何建立實作 IManaged 介面的 ATL COM 元件:
  1. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  2. 按一下 [專案類型] 下的 [Visual C++ 專案,然後按一下 [範本] 下方的 [ATL 專案
  3. 在 [名稱] 文字方塊中輸入 ComComponent],然後再按一下 [確定]]。
  4. ATL 專案精靈] 對話方塊按一下 [應用程式設定] 索引標籤。
  5. 按一下以清除 [使用屬性] 核取方塊然後按一下 [完成]
  6. 在 [方案總管]ComComponent (專案)] 上按一下滑鼠右鍵,並指向 [新增,然後按一下 [加入類別
  7. 加入類別] 對話方塊在 [範本] 下按一下 [ATL 簡單物件],然後按一下 [開啟舊檔]。
  8. ATL 簡單物件精靈] 對話方塊中,輸入 Unmanaged簡短名稱 中的文字] 方塊,然後按一下 [完成]
  9. 在 [類別檢視,請展開 ComComponent],IUnmanaged] 上按一下滑鼠右鍵]、 指向 [新增],然後再按一下 [加入方法]。
  10. 在 [加入方法精靈] 對話方塊,鍵入 UnmanagedMethod方法名稱] 文字方塊中。
  11. LONG * 從清單中選取在 [類型] 下的參數
  12. 按一下以選取 retval參數屬性],然後再在 [參數名稱] 文字方塊中輸入 lRetVal
  13. 按一下 [新增],然後按一下 [完成]
  14. 在 [方案總管],按兩下 Unmanaged.cpp 來開啟檔案。
  15. 對於 CUnmanaged::UnmanagedMethod 的預設程式碼取代下列程式碼:
    *lRetVal = 300;
    return S_OK;
    
  16. 在 [建置] 功能表上按一下 建置方案 建置 COM 元件。
Back to the top

建立.NET 伺服器的步驟

本節會示範如何建立實作單一方法,名為 ManagedServerMethod 的.NET 伺服器。ManagedServerMethod 採用 IManaged 型別的執行個體:
  1. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  2. 在 [專案類型] 下按一下 [Visual C# 專案,然後按一下 [範本] 下方的 [類別庫
  3. 按一下以選取 [加入至方案] 選項,然後再按一下 [確定]
  4. 在預設產生 Class1.cs 檔案以下列程式碼取代預設程式碼:
    using System;
    using System.Runtime.InteropServices;
    
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IManaged
    {
    	long ManagedMethod();
    }
    
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class ManagedServer
    {
    	public void ManagedServerMethod(IManaged managed)
    	{
    		Console.WriteLine("The output of IManaged.ManagedMethod is : {0}", managed.ManagedMethod());
    	}
    }
    
Back to the top

建立包裝函式的步驟

本節說明如何建立包裝函式類別,它會換行 IUnmanaged 型別的執行個體,但公開 IManaged 介面:
  1. 在 [方案總管],展開 ClassLibrary1
  2. ClassLibrary1 中, 以滑鼠右鍵按一下 [參考],然後按一下 [加入參考]。
  3. 在 [加入參考] 對話方塊按一下 [COM] 索引標籤。
  4. 按一下 [元件名稱] 下的 [ComComponent 1.0 型別程式庫]。
  5. 按一下 [選取],然後按一下 [確定]
  6. Class1.cs] 檔案中加入下列敘述所示的程式碼:
    [ComVisible(false)]
    public class ComUnmanaged : IManaged
    {
    	ComComponentLib.IUnmanaged unmanaged;
    
    	public ComUnmanaged(ComComponentLib.IUnmanaged unmanaged)
    	{
    		if(unmanaged != null)
    			this.unmanaged = unmanaged;
    		else
    			throw new ArgumentNullException("NULL");
    	}
    
    	public long ManagedMethod()
    	{
    		return unmanaged.UnmanagedMethod();
    	}
    }
    	
Back to the top

建立自訂的封送處理器的步驟

本節會示範如何建立將 Unmanaged 的介面 (IUnmanaged) 對應到 Managed 介面 (IManaged) 的自訂封送處理器:

自訂封送處理器必須實作 ICustomMarshaler 介面。 受管理的介面對應至 Unmanaged 介面時,會呼叫 MarshalManagedToNative 方法。因為到受管理的網域從 Unmanaged 封送處理目前的分析藍本,MarshalManagedToNative 方法目前的實作會傳回 IntPtr.Zero

MarshalNativeToManaged 方法換行包裝函式物件 (ComUnmanaged) 已在前一節中定義原生的物件。當未受管理的介面對應到 Managed 介面時,會呼叫 MarshalNativeToManaged 方法。

原生介面相關聯的物件被釋出時,會呼叫 CleanUpNativeData 方法。

同樣地,Managed 介面相關聯的物件被釋出時,會呼叫 CleanUpManagedData 方法。因為 Managed 的物件回收 CleanUpManagedData 方法的實作是空的。

GetNativeDataSize 方法會傳回 -1

雖然 GetInstance 方法不定義為 ICustomMarshaler 介面,您必須定義 GetInstance 靜態方法會傳回 ICustomMarshaler 的執行個體。若要建立自訂封送處理器的執行個體之.NET 執行階段會呼叫這個靜態方法。
  1. 加入程式碼遵循 Class1.cs:
    [ComVisible(false)]
    public class SampleMarshaler : ICustomMarshaler
    {
    	static SampleMarshaler marshaler;
    
    	public object MarshalNativeToManaged(IntPtr pNativeData)
    	{
    		if(pNativeData == IntPtr.Zero)
    			return null;
    
    		object rcw = Marshal.GetObjectForIUnknown(pNativeData);
    		if(!(rcw is ComComponentLib.IUnmanaged))
    			throw new ArgumentException("The object must implement IUnmanaged");
    
    		return new ComUnmanaged((ComComponentLib.IUnmanaged) rcw);
    	}
    
    	public IntPtr MarshalManagedToNative(object managedObj)
    	{
    		return IntPtr.Zero;
    	}
    
    	public void CleanUpNativeData(IntPtr pNativeData)
    	{
    		Marshal.Release(pNativeData);
    	}
    
    	public void CleanUpManagedData(object managedObj)
    	{
    
    	}
    
    	public int GetNativeDataSize()
    	{
    		return -1;
    	}
    
    	public static ICustomMarshaler GetInstance(string cookie)
    	{
    		if(marshaler == null)
    			return marshaler = new SampleMarshaler();
    		return marshaler;
    	}
    }
  2. 新增 MarshalAsAttribute 是自訂封送處理的參數。對於 ManagedServerMethod 修改程式碼,如下所示:
    public void ManagedServerMethod(
    	[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(SampleMarshaler)), In]
    	IManaged managed)
    {
    	Console.WriteLine("The output of IManaged.ManagedMethod is : {0}", managed.ManagedMethod());
    }
  3. 在 [建置] 功能表上按一下 建置方案
  4. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  5. 在 [新增專案] 對話方塊按一下 [專案類型] 下的 [Visual C++ 專案,然後按一下 [範本] 下方的 [Win32 專案]。
  6. 在 [名稱] 文字方塊中,輸入 ComClient
  7. 按一下以選取 [加入至方案] 選項,然後再按一下 [確定]
  8. Win32 應用程式精靈] 對話方塊按一下 [應用程式設定] 索引標籤。
  9. 按一下以選取 [主控台應用程式,然後按一下 [完成] 選項在 應用程式輸入] 區段之下。
  10. 方案總管],展開 ComClient],然後再連按兩下 Stdafx.h 檔案以開啟該檔案。加入下列敘述所示的檔案的程式碼:
    #import "ComComponent.tlb" no_namespace raw_interfaces_only named_guids
    #import "ClassLibrary1.tlb" no_namespace raw_interfaces_only named_guids
  11. 在 [方案總管],展開 ComClient,然後再按兩下 [ComClient.cpp 檔案以開啟該檔案。加入程式碼後面 file:
    #include "stdafx.h"
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HRESULT hr;
    	IUnmanaged *unmanagedObj;
    	_ManagedServer *managedServer;
    
    	CoInitialize(NULL);
    	hr = CoCreateInstance(CLSID_Unmanaged, NULL, CLSCTX_INPROC_SERVER, IID_IUnmanaged, (LPVOID *)&unmanagedObj);
    	if(FAILED(hr))
    		goto Error;
    
    	hr = CoCreateInstance(CLSID_ManagedServer, NULL, CLSCTX_INPROC_SERVER, IID__ManagedServer, (LPVOID *)&managedServer);
    	if(FAILED(hr))
    		goto Error;
    
    	hr = managedServer->ManagedServerMethod(unmanagedObj);
    	if(FAILED(hr))
    		goto Error;
    
    	return 0;
    
    Error:
    	CoUninitialize();
    	return hr;
    }
  12. 若要產生 [ClassLibrary1.tlb,請在命令提示字元中輸入命令下列敘述所示:
    regasm /tlb ClassLibrary1.dll
    請確認 ClassLibrary1.dll 檔案 ClassLibrary1 專案的組建目錄中。[ClassLibrary1.dll 會產生 [ClassLibrary1.tlb,並且也會註冊類別程式庫。
  13. ClassLibrary1.tlb 檔案與 [ComComponent.tlb 檔案到專案目錄下 ComClient 應用程式的複本。
  14. 在 [建置] 功能表上按一下 建置方案
  15. ClassLibrary1.dll 檔案和 Interop.comclientLib.dll 檔案從 [ClassLibrary1 的組建目錄的專案建置目錄 ComClient 主控台應用程式的複本。
  16. 在 [方案總管]ComClient] 上按一下滑鼠右鍵,然後按一下 [設定為啟始專案]。
  17. 在 [偵錯] 功能表上按一下 [開始]。
Back to the top

?考

有關其他交互操作性,請參閱由 Adam Natham 書籍:

.NET 和 COM: 的完成交互操作性指南(SAMS 發行集)

取得更多資訊有關自訂封送處理請造訪 Microsoft 開發人員網路] 網站:

Custom Marshaling (http://msdn.microsoft.com/en-us/library/aa719869.aspx)

Back to the top

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