5

Po przejrzeniu wielu różnych artykułów i nie znalezieniu niczego szczególnie rozstrzygającego, co prowadzi mnie krok po kroku przez proces, szukam pomocy .Budowanie biblioteki współdziałania COM dla ASP Classic przy użyciu architektury 4.0 i Visual Studio 2010

Scenariusz

Mój klient jest sprawny tylko w rozwoju dla ASP Classic. Niedawno nabyli konto dla witryny pierwotnie napisanej w ASP.NET. Przetwarzają witrynę w coś, co mogą aktywnie utrzymywać, ale witryna początkowo zawierała obsługę obrazów, która dynamicznie zmieniała dane dotyczące poziomów wody i wyświetla obraz zawierający graficzną reprezentację tych danych. Wymagane jest utworzenie biblioteki interopowej COM, która może być zarejestrowana na serwerze i wywoływana za pomocą CreateObject w celu wygenerowania tablicy bajtów tego samego obrazu dla wyjścia przy użyciu Response.BinaryWrite. Biblioteka współdziałania COM musi być zarejestrowana w zdalnej lokalizacji na serwerze Windows 2000 i nie mogę założyć, że ma ona dostęp do regasm/gacutil, aby wykonać to zadanie.

trudności

I został zbudowany klasy biblioteki tworząc Class Library projektu w Visual Studio 2010, wybierając "Class COM" z szablonu i wstawienie mój kod, aby wygenerować klasę z pojedyncza publiczna metoda zwracania tablicy bajtów po podaniu liczby całkowitej (cóż, moduł wyliczający, ale wszystkie takie same). Niestety, nawet na mojej własnej maszynie programistycznej po zbudowaniu biblioteki i rejestracji (regasis) oraz buforowaniu zespołu (gacutil), nie mogę nawiązać połączenia przez klasyczną ASP, aby utworzyć instancję obiektu, otrzymując zamiast tego komponent "ActiveX nie może utworzyć obiekt "błąd. I, oczywiście, na stronie serwera, plik DLL nie może zostać zarejestrowany, a odpowiedź brzmi "Wymagany moduł nie został znaleziony".

Resources Użyłem

Już miał patrzeć przez następujących artykułach i nie pojawiła się odpowiedź muszę:

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

co muszę

Zasadniczo co potrzebne jest trochę rąk gospodarstwa, w rodzaju krok po kroku, co to będzie podjąć, aby spełnić wymagania i utworzyć moduł COM+ współdziałania poprawnie w Visual Studio 2010. Tworzenie samego obiektu klasy nie jest strasznie trudne.

Jednak żaden z artykułów, które przeglądałem, nie omawia opcji projektu ani nie tworzy procedur za pomocą Visual Studio 2010 lub .NET 4.0 Framework, ani też nie omawiam żadnego z nich, jeśli istnieją specjalne uwagi dotyczące wdrażania w starszych systemach. jak Windows Server 2000 i rzeczywista rejestracja biblioteki w systemie z tylko, powiedzmy, regsvr32 pod ręką.

+0

Dla wszystkich tych, którzy pochodzą z tyłu: Na robi trochę więcej pracy domowej, chciałem zauważyć tutaj, że muszę także kierować do mojej biblioteki .NET Framework 2.0, jak to najnowszy ramy poparte Windows Server 2000. – lsuarez

Odpowiedz

11

Powinny być dość proste, aby uzyskać podstawowe.Zespół NET narażony na działanie COM - Nigdy nie testowałem szablonu projektu klasy COM, więc w ten sposób udało mi się go wykonać w przeszłości:

Stwórz nową bibliotekę klasy .NET (używającą C# lub VB). . Definiowanie interfejsu COM (zastąpi GUID z własną rękę):

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

Teraz zdefiniowanie klasy, która implementuje ten interfejs (ponownie, wymiany GUID z własną rękę):

[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()); 
    } 
} 

Atrybut Prog ID na ten temat class jest tym, czego użyjesz do utworzenia instancji komponentu z ASP.

stanowczo nazwa zespołu (Project Properties - zakładka> „Podpisanie” -> „Zapisz zespół” -> Utwórz nowy plik klucza silny nazwę za pomocą listy rozwijanej)

Teraz budować zespół i zarejestrować przy użyciu Regasm - jeśli nie chcesz rejestrować się w GAC (co polecam, ponieważ GACing nie ułatwia wdrażania), należy użyć parametru -Codebase (to po prostu dodaje wpis reg, który informuje klientów, gdzie znaleźć zespół) - np:

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

teraz powinno być możliwe do wystąpienia komponentu i metod zadzwonić na nim - na przykład (i n javascript):

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

Jeśli chodzi o rozmieszczenie, ważne dzieło, które Regasm i Regsvr32 zrobić, to napisać różne ustawienia w rejestrze, dzięki czemu klienci mogą znaleźć komponent COM (na podstawie Prog ID, lub COM Identyfikator klasy). Wszystko, co musisz zrobić, to ustalić, jakie ustawienia COM są zapisywane, gdy uruchamiasz Regasm na komputerze lokalnym i zapisujesz je w rejestrze na serwerze. Możesz użyć ProcMon, aby monitorować, co zostanie zapisane w rejestrze, gdy uruchomiony jest Regasm.

Ogólnie rzecz biorąc, można oczekiwać, aby zobaczyć coś takiego zapisywane w rejestrze:

[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" 

Nadzieja to pomaga :)

+0

Dziękuję bardzo. Owijarki klasy COM są obsługiwane przez szablon w VS2010, więc ta część jest co najmniej wygodna. W przeszłości zajmowałem się również silnym kluczem nazwy, ponieważ wiele komentarzy/artykułów wspomniało, że jest to wymagane. Myślę, że rozróżnienie polega na tym, że nie wiedziałem ** [ProgId ("Test.Comm.1")] ** byłoby etykietą na zespole, który musiałbym wywołać. To może mi trochę pomóc! Na pewno dam znać, jeśli twoja bardzo dokładna pomoc zostanie usunięta JAK NAJSZYBCIEJ. – lsuarez

+0

Nie ma problemu - jak to się udało? –

+0

Cóż, ironicznie w tym samym momencie w końcu dostaję rozwiązanie problemu, serwer Win2k jest zamieniany na Win 2k8, więc umieścimy handler ASHX w .NET obok ASP. Jednakże, jeśli chodzi o uruchamianie elementów na mojej maszynie programistycznej, pomógł mi to rozwiązać. :] – lsuarez

1

Mam stronę internetową Classic ASP, który używa obiektu VB6 COM. Chciałem stworzyć nową wersję obiektu COM z wykorzystaniem .NET zamiast VB6. Tak to zrobiłem (mam nadzieję, że to pomoże). Załączam instrukcje dla C# i VB.NET.

[01]

  • Uruchom Visual Studio 2015 (uruchom jako administrator).
  • Utwórz nowy projekt "Biblioteki klas".
  • Nazwa go: "DotNetCom"

[02] C#

  • Dodaj nową klasę, nazwę to "HelloCOM".
  • Użyj poniższego kodu począwszy szablon

(odwiedzić https://msdn.microsoft.com/en-us/library/c3fd4a20.aspx aby uzyskać więcej informacji)

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

  • dodać nową klasę „COM ", nazwij go" HelloCOM ".
  • VB.NET tworzy szablon początkowy.
  • Dodaj następującą funkcję do klasy "HelloCOM".

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

[03] C#

  • Otwórz właściwości projektu.
  • Przejdź do "Aplikacja".
  • Kliknij "Informacje o montażu ...".
  • Zaznacz "Utwórz zespół COM widoczny"
  • Przejdź do "Kompilacja".
  • Wybierz "Cel platformy: x86".
  • Check "Rejestracja COM na współdziałanie"

[03] VB.NET

  • Open "myproject".
  • Przejdź do "Kompilacja".
  • Wybierz "Docelowy procesor: x86".

[04]

  • zbudować "DotNetCom.dll".

[05]

  • Otwórz wiersz polecenia (uruchom jako administrator).
  • Zmień katalog na swoją bibliotekę dll.

    cd DotNetComTest\DotNetComTest\TX7NGN.COM\bin\Debug 
    
  • Run regasm/codebase.

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

[06]

  • start Component Services.
  • Dodaj nową aplikację COM +.
  • Nazwij go: "DotNetCom".
  • Otwórz właściwości "DotNetCom".
  • Przejdź do zakładki "Bezpieczeństwo".
  • UNCHECK "Wymuszaj kontrolę dostępu dla tej aplikacji".

[07]

  • Dodaj nowy komponent.
  • Wybierz "DotNetComTest.tlb" (NIE wybieraj "DotNetComTest.dll").

[08]

  • użycie obiektu com stronę Klasyczna ASP.

    <% 
    Dim HelloCOM 
    Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM") 
    Response.Write HelloCom.Hello 
    %> 
    
Powiązane problemy