2008-11-14 85 views
2

這是我的問題:我必須從經典的ASP頁面調用帶有安全頭部的Web服務,該頁面會返回複雜的數據類型。由於涉及第三方工具的各種原因,它必須是傳統的ASP。我們決定創建一個外部dll來做到這一點 - 我這樣做(在c#中),以便它返回一個數據集(ASP可以理解的東西)。但是現在我需要將該函數暴露給ASP頁面。因爲這是傳統的ASP,我認爲唯一直接的方法就是將這個類庫公開爲COM對象。我需要知道完成這項任務的最簡單的方法。我必須對我的DLL做什麼?

我從來沒有創建一個COM對象才使用。有人說我的課必須是靜態的,我不能有一個構造函數。這是真的?有人可以爲我設計步驟嗎?將相當簡單的C#類庫轉換爲COM對象?

幫助! (o:

編輯:現在解決了這個特定的問題,但是羅伯特·羅斯尼指出我不能用經典ASP中的DataSet做任何事情,這導致我發佈第二個問題here關於實現XmlTextWriter - 羅伯特如果你看到這個我認爲你真的可以幫助!

回答

2

不,那(static/no ctor)不是真的。事實上,事實上,因爲COM需要創建一個實例! COM可見。主要是,這只是添加一些屬性,並將其註冊爲COM DLL(regasm)。

http://msdn.microsoft.com/en-us/library/zsfww439.aspx

+0

我的默認構造函數可以有嗎?例如,我希望他們篡改將在wse安全頭中使用的用戶名和密碼,然後調用相應的函數來獲取他們所需的響應。 – silverbugg 2008-11-14 23:49:59

+0

沒有。添加一個'init'方法來提供用戶和pwd給你的班級。 – gbjbaanb 2008-11-15 01:22:09

+0

我的所有領域都必須是公開的,還是可以通過公共屬性公開我的領域以保持適當的數據隱藏? – silverbugg 2008-11-17 19:03:24

2

創建返回一個DataSet類也不是那麼困難:

using System; 
using System.Data; 
using System.Runtime.InteropServices; 

namespace COMTest 
{ 
    [Guid("AC4C4347-27EA-4735-B9F2-CF672B4CBB4A")] 
    [ComVisible(true)] 
    public interface ICOMTest 
    { 
     [ComVisible(true)] 
     DataSet GetDataSet(); 
    } 

    [Guid("CB733AB1-9DFC-437d-A769-203DD7282A8C")] 
    [ProgId("COMTest.COMTest")] 
    [ComVisible(true)] 
    public class COMTest : ICOMTest 
    { 
     public DataSet GetDataSet() 
     { 
      DataSet ds = new DataSet("COMTest"); 
      return ds; 
     } 
    } 

}

你需要檢查「註冊爲COM Interop」框在項目屬性,您還需要簽署大會,並且您需要確保IIS用戶可以訪問您的bin\Debug目錄。

一旦你做到了這一點,你可以從ASP就好創建一個實例:

<% 
Dim o 
Set o = Server.CreateObject("COMTest.COMTest") 
Response.Write("Server.CreateObject worked.") 
Response.Write("<br/>") 
Dim ds 
Set ds = o.GetDataSet() 
If Not ds is Nothing Then 
    Response.Write("o.GetDataSet returned an object. Can we use it?") 
    Response.Write("<br/>") 
    Response.Write("We have a DataSet, and its DataSetName is: ") 
    Response.Write(ds.DataSetName) 
End If 
%> 

在這裏,你會難過。對於雖然返回DataSet的方法對COM可見,但DataSet的屬性或方法都不是。

1

有人說我的課必須是 靜態,我不能有一個構造函數。 這是真的嗎?

一個COM類需要有一個默認構造函數,當客戶端調用CoCreateInstance時,這個默認構造函數將被客戶端使用。對象創建後,您可以在其上設置屬性或調用其他方法。

這與.Net處理可序列化對象的方式類似......您使用默認構造函數構造它,然後設置其所有屬性。 (如果你喜歡RAII,那麼你的COM和.Net的運氣都不好;

至於靜態評論,不,這是不正確的,就像Marc指出的那樣。

相關問題