windows - Sådan registreres 64bit DLL uden gacutil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en ASP Classic applikation, der refererer til nogle VB6 COM OBJECTS. Et af disse VB6 COM OBJECTS refererer til en anden 3. part. Net DLL.


Den 3. part. Net DLL skal registreres på en Windows Server 2008 R2 x64-maskine.


Jeg har fundet scripts til at registrere DLL'en i GAC uden GACUTIL ved hjælp af powershell (ref: http://weblogs.asp.net/adweigert/archive/2008/10/31/powershell-install-gac-gacutil-for-powershell. aspx) [1]


Nu skal jeg registrere forsamlingen. Jeg har brugt både GACUTIL og REGASM på min lokale udviklingsmaskine (x86) uden hitch. Men når jeg forsøger at få DLL'en på testserveren, har jeg problemer.


Første udgave : IKKE GACUTIL


Der er ingen GACUTIL på serveren, som jeg kom omkring ved hjælp af script, der er nævnt ovenfor. Jeg forstår at det kan installeres ved hjælp af SDK, men jeg ønsker ikke at 'forurene' miljøet.


Andet problem : REGASM KAN IKKE FINDE ASSEMBLY


REGASM under 32bit. Net Framework finder ikke DLL. Fejl rapporteret: 'RegAsm: fejl RA0000: Kunne ikke finde input enhed' C: \ Windows \ System32 \ xxxxx.dll 'eller en af ​​dens afhængigheder.'


Så jeg brugte 64bit varianten af ​​RegAsm, og det fungerede.


Min bekymring er dog, at det er en falsk positiv, fordi ASP-klassikeren ikke finder forsamlingen, da den ikke er registreret af 32bit RegAsm.


Jeg kører min applikation Jeg får fejl i min hændelseslog: 'ActiveX-komponent kan ikke skabe objekt'. Generelt sker det, fordi det ikke kan finde objektet, der skal oprettes, hvilket betyder, at DLL'en, der er vært for objektet, ikke er registreret korrekt.


Så hvad jeg forsøger at gøre nu, er at finde ud af, om der er en alternativ metode til REGASM ved hjælp af powershell, der registrerer samlingen i 32Bit-omfanget.


Er der nogen der ved, om det er muligt, og hvad scriptet ville være for at få det rigtigt?

Bedste reference


Jeg fandt ud af at jeg placerede .Net DLL i den forkerte mappe på testmaskinen til registrering.


På et Windows 64Bit OS har du System32 og SysWOW64 mapper. Jeg lagde min DLL i mappen System32, hvor den skulle have været i SysWOW64-mappen.


Fejlen jeg fik fra RegAsm ('RegAsm: error RA0000: Kunne ikke finde input enhed' C: \ Windows \ System32 \ xxxxx.dll 'eller en af ​​dens afhængigheder.') Skulle have fået mig til at klikke, men jeg savnede det.


Grundlæggende kunne 32 Bit RegAsm ikke finde min DLL, men 64 bit RegAsm kunne finde min fil og ved at registrere samlingen med 64 bit RegAsm jeg satte DLL i 64 bit omfang. Jeg havde brug for at være i 32 bit omfang.


Jeg flyttede DLL-formularen System32 til SysWOW64, og 32bit RegAsm fandt DLL'en og registrerede den inden for 32 Bit-omfanget.


Nu kan mit VB6 COM objekt finde .Net DLL og det virker med fejlen. 'ActiveX komponent kan ikke skabe objekt'.


Med det hele sagt har jeg ikke fundet et bibliotek eller en funktion, der vil gøre det samme arbejde som RegAsm uden at bruge RegAsm.


Hvis nogen finder dette mytiske dyr, bedes du svare på dette spørgsmål. Tak på forhånd.

Andre referencer 1


Ikke sikker, men dine problemer synes at stamme fra en bivirkning ved UAC Virtualisering (denne artikel kan også hjælpe), der eksisterer fra Vista og er stadig gyldig her. Et abstrat er, at systemdelen af ​​filsystemet og registreringsdatabasen nu er beskyttet mod brugeradgang, men at antage, at gamle (32 bit) programmer fortsætter med at arbejde med systemet, få dem til at tro, at de skriver på disse dele, men i virkeligheden omdirigerer dem til brugeren s steder.
Se i 'HKEY\_LOCAL\_MACHINE \ SOFTWARE \ Wow6432Node' i dit register. [3]


Et problem, jeg støder på for nylig, er at min MSI blev bygget med en 32 bit bibliotek, så påberåbning af disse biblioteker under installation på en 64 bits maskine gør UAC virtualisering installere mine registreringsnøgler i Wow6432Node. Denne internetartikel hjælper mig med at løse problemet. Jeg bruger Orca til at erstatte Installutillib.dll fra 32 til 64 bit. [4]


Jeg håber det hjælper


JP