webForumDet fria alternativet

Skumt fel... .NET --> COM

.NETur .NET

4 svar · 292 visningar · startad av fredrik

Medlem sedan dec. 19991 072 inlägg
Frågan#1

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...)

Medlem sedan aug. 2001458 inlägg
#2

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.

Läs om CAS i MSDN eller på gotdotnet.com

Medlem sedan dec. 19991 072 inlägg
#3

Tack för tipset!

Det konstiga är att det fungerar om jag gör en asp.net klient och kör mot den riktigt .net-dll.en.

Det borde väl inte heller funka isf?

Medlem sedan okt. 20013 217 inlägg
#4

Ger detta någon ledtråd ?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemTypeInitializationExceptionClassTopic.asp

Vilket betyder :

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.

Sök på COM-Interopt i MSDN.

Medlem sedan dec. 19991 072 inlägg
#5

Tack för tipset...vet inte om jag blev så mkt klokare men det är alltid nåt!

Själva COM-interop.en funkar annars från ASP3.
Jag kan nämligen ropa på publika egenskaper från .net-dllen och då skriva ut dem.

Det är bara när jag ropar på en metod som använder .net-specifika klasser (system.drawing.image) som det verkar balla ur.

126 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)