Jag har skapat en komponent i .NET som jag behöver anropa från COM. (byggd i .NET pga. enklare hantering av tex. bilder).
Jag har gjort alla steg (antar jag...)
- Skapat snk-fil (strong key)
- Reggat snk-filen i assamblyn
- Skapat TypeLib. på dll.en.
- Reggat dll.en i GAC.en
Om jag nu provat komponenten i VB (6) så funkar den perfekt! Jag refererar in den och kan använda den som jag vill.
MEN...när jag nu försöker från ASP så får jag ett mycket skumt fel:
System.Drawing (0x80131534)
The type initializer for "System.Drawing.SafeNativeMethods" threw an exception.
Så...jag tänkte att det kanske var nåt med att ASP inte kunde anropa .NET via COM, så jag skapade en "wrapper" i VB6 där jag helt enkelt körde mot .NET-komponenten där. Jag testade även att köra mot komponentprogrammet via en windows-klient, funkar klockrent!
Men när jag kör ASP mot min VB6-wrapper så vägrar den...samma fel igen!
I min .NET-komponent använder jag "system.drawing.image"-biblioteket.
Man frågar sig då....vad är det för skillnader på att köra via IIS.en eller via ett windows-progg?
Jag har funderat på om det kan vara nåt med rättigheter...men det verkar inte som det...
vilka rättigheter måste vara satta för att tex. kunna hämta upp en fil från en viss mapp? (jag har everyone full control nu...)
Tacksam för alla tips eller idéer som ni kan tänkas ha!
(jag har sökt efter bla "SafeNativeMethods" på både MSDN och Altavista utan någon enda träff...)
Ditt problem har med rättigheter att göra, men inte Windows ACLer, utan Code Access Security i .Net. Jag är inte 100 på hur man löser det, men du kan få några uppslag.
Viktigt är att förstå att CLRs säkerhetsmodell inte är samma sak som NTFS-säkerhet eller vad du sätter i IIS:en. CLR definierar code access security (CAS) på ett assembly. Det är saker som att man får UIPermission för att rita fönster, eller FilePermissions för att accessa filsystemet. Det är mer deklarationer av vad för typer av händelser ett assembly får göra än windows access-listor.
När du då kör din vb6-exe som använder ett COM-objekt har din användare ganska hög trust, eftersom det körs från zonen LocalMachine. Sånt sätter man upp i filen "\WINDOWS\Microsoft.NET\Framework\v1.0.3705\config\security.config" som du kan administrera enklare med caspol.exe eller "\WINDOWS\Microsoft.NET\Framework\v1.0.3705\mscorcfg.msc" (Configure Code Access Security Policy)
Sen när det körs under IISen får du av någon anledning inte samma förutsättningar. Vet inte riktigt vad som får fel. Kanske är det någon annan config-fil som tar överhand. En gissning är att man behöver ha rättigheter att skapa fönster (vilket IISen inte har när den körs som service, om man inte klickar i interact with desktop) och då får man inte ens ladda assemblyt System.Drawing.dll, utan får ett security-exception.
When a class initializer fails to initialize a type, a TypeInitializationException is created and passed a reference to the exception thrown by the type's class initializer.
Jag läste en sak i MSDN :
All managed types, methods, properties, fields, and events that you want to expose to COM must be public. Types must have a public default constructor, which is the only constructor that can be invoked through COM.