共用方式為


COM 元件相容性

更新:2007 年 11 月

大部分 COM 元件都可以使用 ASP.NET。當使用舊版的 Active Server Pages (ASP) 時,您仍然可以使用 CreateObject 函式 (Visual Basic) 對元件進行晚期繫結呼叫。如需詳細資訊,請參閱 .NET Framework 應用程式中的 COM 互通性

此主題包括下列章節:

  • 早期繫結

  • 64 位元元件

早期繫結

雖然仍支援晚期繫結至元件,但為了效能,最好採用早期繫結 (Early-Binding)。一個名為 型別程式庫匯入工具 (TlbImp.exe) 的工具 (包含在 Windows Software Development Kit (SDK) 中) 可以藉由在元件周圍建置 Managed 包裝函式,將 .dll 檔案中的標準 COM 元件轉換成對等的 .NET Framework 組件 (Assembly)。轉換後的元件可早期繫結至 Managed 程式碼,以大幅提升效能。如需 Tlbimp.exe 的詳細資訊,請參閱將 COM 元件公開給 .NET Framework。如需將 COM 元件轉換為 Managed 程式碼的資訊,請參閱建置 COM 元件的互通

在 COM 元件轉換為 .NET Framework 組件後,您可以藉由在網頁最上方放置指示詞,將它匯入 ASP.NET Web 網頁。例如,以下指示詞匯入命名空間 MyNewNamespace,這個命名空間是由 Tlbimp.exe 所建立的。

<%@Import Namespace="MyNewNamespace"%>

Tlbimp.exe 產生的組件檔必須放置在 ASP.NET 應用程式的 Bin 目錄下。原始 COM 元件檔必須要針對它所在的目錄加以註冊。

當使用單一執行緒 Apartment (Single-Threaded Apartment,STA) COM 元件時,例如來自 ASP.NET Web 網頁、使用 Visual Basic 開發的元件,您必須將相容性屬性 AspCompat=true 包含在 ASP.NET Web 網頁的 <%@ Page > 標記中,如下列程式碼範例所示。

<%@Page AspCompat=true Language = VB%>

AspCompat 屬性會強迫網頁在 STA 模式下執行。如果忽略相容性標記並參考網頁上的 STA 元件,Runtime 會擲回例外狀況。如果您將 STA 元件轉換為使用 Tlbimp.exe 的組件,執行階段將不會偵測使用 STA 模型的元件,也不會擲回例外狀況,但是應用程式的效能會變差。

重要事項:

在建構階段建立的 COM 元件,會在將要求排程到 STA 執行緒集區之前執行,導致在多執行緒 Apartment (Multithreaded Apartment Model,MTA) 執行緒上執行。這樣做會對效能造成實質上負面的影響,應該加以避免。如果您使用 AspCompat 搭配 STA 元件,只能從 Page_Load 事件或稍後在執行鏈結中建立 COM 元件,而不是在網頁建構階段建立。

例如,以下成員宣告在建構階段建立元件。

<%@ Page AspCompat="true" Language="C#" %>

<script >
    // The components is created at construction time.
    MyComObject comObj = new MyComObject();
    
    protected void Page_Load(object sender, EventArgs e)
    {
        // The object is first used here.
        comObj.DoSomething();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" >
    <div>
    
    </div>
    </form>
</body>
</html>
<%@ Page AspCompat="true" Language="VB" %>

<script >
    ' The components is created at construction time.
    Dim comObj As MyComObject = New MyComObject()
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        ' The object is first used here.
        comObj.DoSomething()
    End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" >
    <div>
    
    </div>
    </form>
</body>
</html>

應該改用以下的程式碼。

<%@ Page AspCompat="true" Language="C#" %>

<script >
    protected void Page_Load(object sender, EventArgs e)
    {
        // The component is created and used after the code is running 
        // on the STA thread pool.
        MyComObject comObj = new MyComObject();
        comObj.DoSomething();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" >
    <div>
    
    </div>
    </form>
</body>
</html>
<%@ Page AspCompat="true" Language="VB" %>

<script >
    ' The component is created and used after the code is running 
    ' on the STA thread pool.
    Dim comObj As MyComObject = New MyComObject()
    comObj.DoSomething()
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" >
    <div>
    
    </div>
    </form>
</body>
</html>

64 位元元件

在 64 位元版本的 Microsoft Windows 上,可以使用 WOW64 模擬器執行 32 位元的應用程式。但是,處理序只能是 32 或 64 位元。處理序無法同時執行兩種版本。

網際網路資訊服務 (IIS) 在 64 位元版本的 Windows 上會當做 64 位元應用程式執行。COM 元件的處理序類型必須符合 IIS 背景工作處理序類型。您可以使用下列其中一種方案,在 64 位元 IIS 上執行 32 位元的元件:

建議您將元件轉換為 64 位元。在 Visual Basic 元件的情況下,因為沒有 64 位元版本的 Visual Basic 編譯器,所以沒辦法執行這個動作。

請參閱

工作

HOW TO:升級 ASP.NET 中現有的 MTS 元件的權限

概念

將 COM 元件公開給 .NET Framework

建置 COM 元件的互通

ASP.NET 網站中的共用程式碼資料夾