5

在閱讀了大量不同的文章之後,沒有發現任何特別確鑿的結論,它使我逐步瞭解整個流程,我尋求幫助。使用4.0框架和Visual Studio 2010爲ASP Classic構建一個COM互操作庫

場景

我的一個客戶端只能在發展ASP Classic精通。他們最近獲得了原來用ASP.NET編寫的網站的帳戶。他們正在將網站滾動到可以主動維護的位置,但該網站最初包含一個圖像處理程序,該程序會動態更改有關水位的數據並輸出包含該數據圖形表示的圖像。要求是開發一個COM互操作庫,可以在服務器上註冊並使用CreateObject調用,以生成使用Response.BinaryWrite輸出的相同圖像的字節數組。 COM互操作庫必須在Windows 2000 Server上的遠程站點上註冊,我不能假設他們有權訪問regasm/gacutil來完成該任務。

的難度

我已經通過創建在Visual Studio 2010中類庫項目建成類庫,從模板中選擇「COM類」,並插入我的代碼來生成與類一個單一的公共方法返回一個字節數組時,給定一個整數(以及枚舉器,但都一樣)。不幸的是,即使在我自己的開發機器上,在構建庫並註冊(regasm)和緩存程序集(gacutil)之後,我無法通過Classic ASP實例化對象,而是接收組件「ActiveX」對象「錯誤。而且,當然,在服務器站點上,DLL文件不能被註冊,響應是「找不到必需的模塊」。

資源我用

我已經不得不通過下面的文章一看,並沒有翻起來的答案,我需要:

  1. (基本步驟)Walkthrough: Creating COM Objects with Visual Basic
  2. Build and Deploy a .NET COM Assembly
  3. .NET COM+ Interop Component with Classic ASP

我需要什麼樣的

基本上我需要的是通過它要採取符合要求並正確地創建一個COM+互操作模塊的一個工序的一種步驟的位手把手的在Visual Studio 2010中。創建實際的類對象本身並不是非常困難。

但是,我查看的所有文章都沒有真正討論過使用Visual Studio 2010或.NET 4.0 Framework進行項目選擇或構建過程,也沒有人真正討論過是否需要特別考慮部署到舊系統比如Windows Server 2000,以及手頭上只有regsvr32的系統上庫的實際註冊。

+0

所有這些誰進來背後:在做多一點功課,我想在這裏請注意,我還需要我的圖書館定位到.NET 2.0框架,因爲這是通過支持最新的框架Windows Server 2000. – lsuarez 2011-02-08 16:08:52

回答

11

它應該是相當簡單的基本。NET組件暴露給COM - 我從來沒有嘗試COM類項目模板,所以這是我過去管理它的方式:

使用C#或VB創建一個新的(bog標準).NET類庫。定義一個COM接口(換成你自己的GUID):

[ComVisible(true)] 
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")] 
public interface IComm 
{ 
    string GetMyGroups(); 
} 

現在定義實現該接口的類(再次,換成你自己的GUID):

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None)] 
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")] 
[ProgId("Test.Comm.1")] 
public class Comm : IComm 
{ 
    public string GetMyGroups() 
    { 
     var comm = new CommunicatorAPI.MessengerClass(); 

     var groups = comm.MyGroups as IMessengerGroups; 
     return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray()); 
    } 
} 

關於這方面的程序ID屬性類是你將用來從ASP實例化你的組件的東西。

強烈名稱的組件(項目屬性 - >「簽名」選項卡 - >「程序集簽名」 - >創建使用下拉一個新的強名稱密鑰文件)

現在,編譯彙編,並註冊使用Regasm - 如果您不希望在GAC中註冊(我建議,因爲GACing不會使部署更簡單),請確保使用-Co​​debase參數(這只是添加了一個註冊表項,它告訴客戶端在哪裏找到大會) - 例如:

regasm ClassLibrary2.dll /codebase "S:\Testing\ClassLibrary2\ClassLibrary2\bin\Debug\ClassLibrary2.dll" 

現在你應該能夠實例化組件,並調用它的方法 - 例如(我ñ的JavaScript):

var a = new ActiveXObject("Test.Comm.1"); 
alert(a.GetMyGroups()); 

當涉及到部署,該Regasm和Regsvr32的做的重要工作就是編寫各種設置進入註冊表,以便客戶端可以找到COM組件(基於程序ID,或COM班級號)。所有你需要做的是計算當你在本地機器上運行Regasm時正在編寫什麼COM設置,並將它們寫到服務器上的註冊表中。您可以使用ProcMon來監視Regasm運行時寫入註冊表的內容。

一般來說,你可能會看到這樣的事情寫入註冊表:

[HKEY_CLASSES_ROOT\Test.Comm.1] 
@="ClassLibrary2.Comm" 

[HKEY_CLASSES_ROOT\Test.Comm.1\CLSID] 
@="{00585504-90C8-4760-A359-67CAF08FFED1}" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}] 
@="ClassLibrary2.Comm" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="ClassLibrary2.Comm" 
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a" 
"RuntimeVersion"="v4.0.30319" 
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32\1.0.0.0] 
"Class"="ClassLibrary2.Comm" 
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a" 
"RuntimeVersion"="v4.0.30319" 
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\ProgId] 
@="Test.Comm.1" 

希望這有助於:)

+0

非常感謝。 COM Class包裝器由VS2010中的模板處理,至少該部分方便。由於很多評論/文章都提到它是必需的,我在過去的版本中也處理了強名關鍵字。我認爲區別在於我不知道** [ProgId(「Test.Comm.1」)] **是我需要調用的程序集上的標籤。這可能對我很有幫助!如果您非常全面的幫助已儘快完成,我一定會告訴您。 – lsuarez 2011-02-08 15:13:42

1

我有一個使用VB6 COM對象傳統的ASP網站。我想用.NET代替VB6創建COM對象的新版本。這是我做到的(希望這有助於)。我包括C#和VB.NET的說明。

[01]

  • 啓動Visual Studio 2015年(以管理員身份運行)。
  • 創建一個新的「類庫」項目。
  • 將它命名爲: 「DotNetCom」

[02] C#

  • 添加一個新的類,命名爲 「HelloCOM」。
  • 使用下面的代碼作爲起始模板

(查看https://msdn.microsoft.com/en-us/library/c3fd4a20.aspx獲取更多信息)

using System.Runtime.InteropServices; 

    namespace DotNetCom 
    { 
     [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")] 
     public interface HelloCOMInterface 
     { 
      [DispId(1)] 
      string Hello(); 
     } 

     [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), 
      InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
     public interface HelloCOMEvents 
     { 
     } 

     [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), 
      ClassInterface(ClassInterfaceType.None), 
      ComSourceInterfaces(typeof(HelloCOMEvents))] 
     public class HelloCOM : HelloCOMInterface 
     { 
      public string Hello() 
      { 
       return "Hello there!"; 
      } 
     } 
    } 

[02] VB.NET

  • 添加一個新的「COM類「,將其命名爲」HelloCOM「。
  • VB.NET創建起始模板。
  • 將以下函數添加到「HelloCOM」類。

    Public Function Hello() As String 
        Return "Hello there!" 
    End Function 
    

[03] C#

  • 打開項目屬性。
  • 轉到「應用程序」。
  • 點擊「裝配信息...」。
  • 選中「Make assembly COM-Visible」
  • 轉到「Build」。
  • 選擇「平臺目標:x86」。
  • 檢查 「註冊COM互操作」

[03] VB.NET

  • 打開 「MyProject的」。
  • 轉到「編譯」。
  • 選擇「目標CPU:x86」。

[04]

  • 構建 「DotNetCom.dll」。

[05]

  • 打開命令提示符(如運行管理員)。
  • 將目錄切換到您的dll。

    cd DotNetComTest\DotNetComTest\TX7NGN.COM\bin\Debug 
    
  • 運行RegAsm/codebase。

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm DotNetComTest.dll /codebase "C:\DotNetComTest\DotNetComTest\bin\Debug\DotNetComTest.dll" 
    

[06]

  • 啓動組件服務。
  • 添加一個新的COM +應用程序。
  • 將其命名爲:「DotNetCom」。
  • 打開「DotNetCom」屬性。
  • 轉到「安全選項卡」。
  • UNCHECK「強制對此應用程序進行訪問檢查」。

[07]

  • 添加新的組件。
  • 選擇「DotNetComTest.tlb」(不要選擇「DotNetComTest.dll」)。

[08]

  • 使用從傳統的ASP頁面的COM對象。

    <% 
    Dim HelloCOM 
    Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM") 
    Response.Write HelloCom.Hello 
    %> 
    
相關問題