c# - Reg Free Com z VB6 na Windows 7

Translate

Mam kod .NET, którego używam z kodu VB6. Zawsze rozwijałem to na komputerze XP, tworząc plik VB6.exe.manifest, który zawierał listę zależnych zestawów .NET.

Na przykład załóżmy, że moje 2 zestawy .NET to Some.Assembly.A.dll i Some.Assembly.B.dll, oto jak wygląda VB6.EXE.manifest (używam wersji = 1.1.0.0 poniżej, ponieważ jest to wersja Ustawiłem na .NET AssemblyVersion w AssemblyInfo.cs):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
   manifestVersion="1.0">
  <assemblyIdentity
              type = "win32"
              name = "client"
              version = "1.1.0.0" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.A"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.B"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
</assembly>

Następnie wraz z bibliotekami DLL w tym samym katalogu mam zestawy i ich własne pliki manifestu. Oto przykład „Some.Assembly.A.dll.manifest”:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
  <assemblyIdentity
      type="win32"
      name="Some.Assembly.A"
      version="1.1.0.0" />
  <clrClass
      clsid="{F1234567-1234-1234-1234-123456789012}"
      progid="Some.Assembly.A.Class1"
      threadingModel="Both"
      name="Some.Assembly.A.Class1" >
  </clrClass>
  <file name = "Some.Assembly.A.dll" />
</assembly>

Ja też biegamtlbexpna przywoływanych bibliotekach DLL, aby utworzyć pliki TLB i do tego odwołuję się w moim pliku projektu VB6.

Chcę przejść na komputer z systemem Windows 7 64 BIT. Korzystając z tych samych metod, gdy trafiam na kod VB6, który tworzy instancję obiektu .NET na maszynie WIN7, otrzymuję

„Składnik ActiveX nie może utworzyć obiektu”.

Na XP to się udaje. Jeśli celowo błędnie przeliteruję Dependent assembly w VB6.EXE.manifest - na XP otrzymam

„Nie udało się uruchomić tej aplikacji, ponieważ konfiguracja aplikacji jest nieprawidłowa. Ponowna instalacja aplikacji może rozwiązać ten problem”.

Na WIN7, VB6 po prostu się ładuje. To tak, jakby ignorował manifest na WIN7, więc nie mogę załadować mojego obiektu .NET przy użyciu metod REG FREE na WIN7. Jeśli jaregasmDLL, wszystko działa.
Jakieś pomysły, jak sprawić, by VB6 działało z reg free com na WIN7 (64 BIT)?

This question and all comments follow the "Attribution Required."

Wszystkie odpowiedzi

Translate

Czy próbowałeś po prostu zainstalować i uruchomić VB6 w trybie zgodności z WinXP?

Źródło
Translate

Jeśli rekompilujesz plik vb6.exe lub przetwarzasz go w inny sposób dla maszyny win7, powinieneś wiedzieć, że niektóre z nowszych narzędzi programistycznych automatycznie osadzają manifest, więc możesz to sprawdzić (szybkim sposobem jest otwarcie pliku wykonywalnego w VS i poszukaj zasobu RT_MANIFEST o identyfikatorze 1). Jeśli istnieje osadzony manifest, manifesty zewnętrzne są ignorowane, dlatego prawdopodobnie podczas edycji zewnętrznego pliku manfiest nic się nie dzieje, a jego zawartość jest ignorowana.

Poza tym, co Erno powiedział o sxstrace (czy możesz opublikować wyniki otrzymane z sxstrace?), Pamiętaj, aby zaktualizować znacznik czasu VB6.exe, jeśli manifest jest w nim osadzony, lub VB6.exe.manifest w przeciwnym razie. Vista + Win7 buforuje zawartość manifestów, wyłączając sygnaturę czasową manifestu głównego, aby lokalne zmiany mogły nie zostać odebrane. Jeśli sxstrace daje puste wyniki, zaktualizuj sygnatury czasowe i spróbuj ponownie.

Źródło
Anonymous
Translate

Pierwszą rzeczą, która przychodzi na myśl, jest to, że warto spróbować podpisać kod .net. Może się zdarzyć, że niejawnie jakiś wyższy poziom bezpieczeństwa jest stosowany w 64-bitowym systemie win7, który wymaga podpisanych odwołań do zestawu.

Ponadto możesz spróbować zawęzić problem przez (w dowolnej kolejności)

  • oznacz program jako administrator i spróbuj ponownie.
  • etykieta programu do uruchomienia w "trybie zgodności xp / win2k"
  • uruchom todependencywalker(posiada opcję symulacji ładowania programu i rejestruje błędy)

Powodzenia!

Źródło
Translate

Robiłem to hybrydowe debugowanie pewnego dnia i otrzymałem błąd: `` Składnik ActiveX nie może utworzyć obiektu ''. Sugeruję, abyś postępował zgodnie z tym artykułemDebugowanie aplikacji hybrydowych Visual Basic 6.0 / Visual Basic .NETi upewnij się, że przykład gołej kości działa na twoim komputerze z Win7 (rozumiem, że działa z regazmem). Następnie za pomocą bitu REG FREE zbadałem następujące linki:Obiekt .NET z VB6 bez użycia regasm.exe?i tuAktywacja bez rejestracji składników opartych na platformie .NET: przewodnik

Źródło
wqw
Translate

Możesz spróbować użyć/ win32opcjatlbexpw systemie operacyjnym x64.

Źródło
Translate

Odten wpis na blogu

możesz użyć SxsTrace, aby pomóc w debugowaniu problemu. Aby rozpocząć śledzenie, uruchom „SxsTrace Trace -logfile: SxsTrace.etl”, aby przekonwertować plik dziennika na coś, co można wyświetlić, uruchom „SxsTrace Parse -logfile: SxsTrace.etl -outfile: SxsTrace.txt”.

Czy próbowałeś tego?

Inną rzeczą jest to, że na Vista / Windows 7 możesz łatwo uruchomić UAC, czy sprawdziłeś to?

Źródło
Translate

Udało mi się z powodzeniem używać klas .Net z VB6 w Win 7-64 przy użyciu manifestów utworzonych przezTwórca manifestów obok siebie. Ma bezpłatną wersję próbną.

Nie zapomnij dołączyć wersji środowiska wykonawczego .Net, na którą są przeznaczone Twoje klasy. To może być twój problem na początku, ponieważ Windows 7 jest dostarczany z preinstalowanym profilem klienta .Net 4.

Źródło
Translate

Regasm robi o wiele więcej niż tylko generowanie TLB lub potrzebnych kluczy rejestru.

Na przykład może generować widoczne interfejsy COM w oparciu o widoczne typy COM. Regasm zrobi to, gdy widoczny typ COM nie implementuje na przykład interfejsu.

Czy masz jakieś widoczne typy COM, które nie implementują interfejsu (lub nie definiują interfejsu COM przy użyciu ComDefaultInterfaceAttribute)?

Jeśli tak, to może być twój problem.

Źródło
O autorze