AssemblyName
Hur kan man få tag i fulla namnet för t ex den assembly som innehåller namespacet "System.Windows.Forms"?
Svara
Sv: AssemblyName
System.Windows.Forms.dll heter den ;)
Nä men om du har en instans av ett objekt kan du använda obj.GetType().ToString()
eller så plockar du fram typ informationen <b>Type t = typeof(Form)</b>.
Svara
Sv: AssemblyName
Men om jag inte har någon instans av någon klass som finns i den assemblyn då... och inte heller vet vilka klasser den innehåller... Jag antar att jag får loopa igenom AppDomain.CurrentDomain.GetAssemblies() tills jag hittar rätt...
Svara
Sv: AssemblyName
<b>Dagens .NET Trivia:</b> När laddas en assembly in i huvud-appdomainen?
<b>(a)</b> Vid programuppstart då det finns en referens till den i mitt projekt.
<b>(b)</b> När den behövs för första gången- något annat vore slöseri på minne.
Om du svarade <b>(a)</b> på ovanstående fråga har du ett problem. Svaret är <b>(b)</b> vilket gör att om du inte har någon objekt av en typ som finns i assemblyn så kan du inte heller hitta den i din AppDomain. Så du får antingen se till att du har ett objekt, eller explicit ladda in den i din AppDomain. Tänk på att en assembly som du laddar in i en AppDomain kan inte frigöras förrens AppDomainen förstörs, så om du bara skall udnersöka en godtycklig assembly och sen kasera den så skapa en ny AppDomain du kan skrota sen när du är klar.
Dagens .NET Trivia presenterades i sammarbete med Pellesoft och Cloetta Kexchocklad =)
//Andreas
Svara
Sv: AssemblyName
Det kan du generellt inte, eftersom namespaces kan spänna över flera assemblies, och det finns ingen garanti att namnen överensstämmer.
MS
Svara
Sv: AssemblyName
Mattias,
Ahh hemliga svars alternativ <b>(c)</b> som kombinerade mitt <b>(b)</b> med ditt svar ;-) Men du har så rätt så, tänker nästan aldrig på det fast än flera av mina namespaces ligger i flera assemblies :-D
//Andreas
Svara
Sv: AssemblyName
Hur skulle man kunna kolla vilken assembly en klass ligger i (har endast en sträng, t ex System.Windows.Forms.Label) och ta reda på dess assemblyname, endast strängen räcker ju inte om man vill använda Type.GetType(sträng) utan man verkar ju behöva assemblyname också, rätta mig om jag har fel...
Svara
Sv: AssemblyName
du skall kunna ladda en type med bara Type.GetType("System.Windows.Forms.Label");
men om inte Assemblyn som den klassen ligger i är laddad så kommer du få ett exception. Du kan ladda assemblyn med System.Reflection.Assembly.Load(namnet);
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemReflectionAssemblyClassLoadTopic3.asp?frame=true
Svara
Sv: AssemblyName
Johan,
Orginal frågan var att han ville veta just vilken assembly typen fanns i .. då blir det lite lurigare ;)
//Andreas
Svara
Sv: AssemblyName
Jo, jag vet... men det var mer svaret på Type.GetType()
Det borde vara omöjligt att veta assemblyn om den inte är laddad... Systemet kan ju inte gärna gissa ;-)
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTypeClassAssemblyTopic.asp?frame=true
1 2 | Type myType=Type.GetType( "System.Windows.Forms.Label" ); string assemblynamn=myType.Assembly.FullName.ToString(); |
Svara
Sv: AssemblyName
Precis, finns den inte laddad eller kunner i någon av probe sökvägarna är man nog toast =)
//Andreas
Svara
Sv: AssemblyName
om man har mycket tid och prestanda över så kan man ju alltid loopa igenom hela gac:en samt alla möjliga kataloger i microsoft.net\framework\v1.*\* samt ev. bin-kataloger till programmet eller liknande... ;)
Svara
Sv: AssemblyName
Och om man vill hitta en 3e parts typ? Loopa igenom alla paritioner och undersöka alla essmeblys ? låter som en roligt sak "vänta söker igenom hela din dator .. detta kan ta upp till en timme beroenbde på hur stora hårdsiskar du har" :-D
//Andreas
Svara
Sv: AssemblyName
Assemblyn är laddad i AppDomain men inte i ExecutingAssembly vilket gör att Type.GetType inte verkar hitta den...
Svara
Sv: AssemblyName
Ok, jag har för mig att jag hade samma problem. Vet inte vad det beror på men jag har för mig att jag löste det enligt följande:
1 2 | Assembly ass=Assembly.Load( "myassembly.dll" ); Type myType=ass.GetType( "MyType" ); |
Förmodligen kan man göra nåt mer optimalt men testa om inte det fungerar för dig...
Svara
Sv: AssemblyName
hur kan man ta reda på filnamnet (hela filnamnet) för en dll fil som ligger i gac:en t ex System.Windows.Forms.dll då?
Svara
Sv: AssemblyName
Ok, nu kommer säker nån att skrika men testa med Assembly ass=Assembly.LoadWithPartialName("System.Windows.Forms");
Inget som kanske rekommenderas och det finns säkert nån bättre lösning...
Svara
Sv: AssemblyName
Titta på metoden GetAssemblies i AppDomainen. Den returnerar samtliga laddade assemblies. Sedan är det ju en smalsak att leta igenom de assemblierna efter några typer...
Svara
Sv: AssemblyName
Nä han vill juh veta vilken assembly som innehåller en sak, då kan han juh inte göra det för det är juh inte säkert att den är laddad i appdomainen och sen sa han faktiskt i sitt andra inlägg
<b>Jag antar att jag får loopa igenom AppDomain.CurrentDomain.GetAssemblies() tills jag hittar rätt... </b>
Men som sagt, funkar bara om du har ett objekt av en klass i assemblyn eller om du explicit laddat in den i din appdomain =)
//Andreas
Svara
Sv: AssemblyName
som JohanS skrev förut:
>Assemblyn är laddad i AppDomain men inte i ExecutingAssembly vilket gör att Type.GetType inte verkar hitta den...
så fungerar det med den metoden :)
Svara
Sv: AssemblyName
mmm... det gör att man måste lägga till assemblynname till klassnamnet när man ska använda Type.GetType...
Måste ju (borde iallafall) finnas något enkelt sätt att kontrollera vilken assembly den tillhör och därav få ut assemblyname om man bara har en sträng med klassnamnet (tex "System.Windows.Forms.Label") och man vet att assemblyn är laddad i AppDomain...
Svara
Sv: AssemblyName
Johan,
20 inlägg i tåden - då blir det dags för den obligatoriska "Kan du beskriva vad det är du vill göra och varför så vi kan sätta det i ett sammanhang". Genom att ventilea vad och varför du vill göra så kanske en lämplig (alternativ) lösning kan uppdagas.
//Andreas
Svara
Sv: AssemblyName
Okej, jag försöker göra en egen enkel implementation av xaml. Som input har jag en xml-fil som innehåller typ:
<code>
<control name="Form">
<property name="Text">blabla</property>
<property name="Controls">
<control name="Label">
<property name="Text">blabla</property>
</control>
</property>
</control>
</code>
I det här fallet har jag begränsat mig så jag vet att alla kontroller, finns i System.Windows.Forms, även om inte alla property's gör det så är det enkelt att få ut dom med text GetProperty. Jag förutsätter också i mitt fall att assemblyn redan är laddad.... allt det här fungerar, var faktiskt otroligt enkelt... krävde typ 100 rader....
Problemet är om man ska introducera kontroller och klasser som inte tillhör System.Windows.Forms, hur ska jag utifrån namespacet och classnamnet ta reda på AssemblyName, möjligtvis lägger jag till att man måste skriva in namnet på dll filen också, i det här fallet System.Windows.Forms.dll, problemet är att alla sätt jag vet för att ladda en assembly kräver en absolut eller relativ sökväg till dll-filen. Det fungerar väl om den ligger i samma katalog som xml-filen men om dll-filen ligger i GAC:en hur tar jag reda på sökvägen då?
Hoppas det här hjälper er (att hjälpa mig :) )
Svara
Sv: AssemblyName
Johan,
XAML mappar upp XML namespaces mot Namespace/Assembly par genom att göra följande
1 2 3 4 | <? Mapping XmlNamespace = "animC" ClrNamespace = "MSAvalon.Windows.Media.Animation" Assembly = "PresentationCore" ?> <? Mapping XmlNamespace = "animF" ClrNamespace = "MSAvalon.Windows.Media.Animation" Assembly = "PresentationFramework" ?> |
De visar hur under <b>Animations</b> på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnintlong/html/longhornch03.asp
Du kan troligen hitta mer information om <?Mapping> genom att använda Google/Google Groups eller titta i Longhorn SDK:n.
Men kontentan är att du måste ange <b>både</b> namespace och assembly name för att kunna använda kontrollerna i ditt XAML dokument, sen snyggar de till det genom att mappa till olika XML namespaces så man inte råkar ut för kollisioner med att klasser heter samma sak i olika namespaces.
Hoppas det löser sig!
//Andreas
Svara