Hur kan man få tag i fulla namnet för t ex den assembly som innehåller namespacet "System.Windows.Forms"? System.Windows.Forms.dll heter den ;) 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... <b>Dagens .NET Trivia:</b> När laddas en assembly in i huvud-appdomainen? Det kan du generellt inte, eftersom namespaces kan spänna över flera assemblies, och det finns ingen garanti att namnen överensstämmer. Mattias, 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... du skall kunna ladda en type med bara Type.GetType("System.Windows.Forms.Label"); Johan, Jo, jag vet... men det var mer svaret på Type.GetType() Precis, finns den inte laddad eller kunner i någon av probe sökvägarna är man nog toast =) 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... ;) 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 Assemblyn är laddad i AppDomain men inte i ExecutingAssembly vilket gör att Type.GetType inte verkar hitta den... 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: 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å? Ok, nu kommer säker nån att skrika men testa med Assembly ass=Assembly.LoadWithPartialName("System.Windows.Forms"); 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... 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 som JohanS skrev förut: mmm... det gör att man måste lägga till assemblynname till klassnamnet när man ska använda Type.GetType... Johan, Okej, jag försöker göra en egen enkel implementation av xaml. Som input har jag en xml-fil som innehåller typ: Johan,AssemblyName
Sv: AssemblyName
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>.Sv: AssemblyName
Sv: AssemblyName
<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 =)
//AndreasSv: AssemblyName
MSSv: AssemblyName
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
//AndreasSv: AssemblyName
Sv: AssemblyName
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=trueSv: AssemblyName
Orginal frågan var att han ville veta just vilken assembly typen fanns i .. då blir det lite lurigare ;)
//AndreasSv: AssemblyName
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
Type myType=Type.GetType("System.Windows.Forms.Label");
string assemblynamn=myType.Assembly.FullName.ToString();
Sv: AssemblyName
//AndreasSv: AssemblyName
Sv: AssemblyName
//AndreasSv: AssemblyName
Sv: AssemblyName
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...
Sv: AssemblyName
Sv: AssemblyName
Inget som kanske rekommenderas och det finns säkert nån bättre lösning...Sv: AssemblyName
Sv: AssemblyName
<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 =)
//AndreasSv: AssemblyName
>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 :)Sv: AssemblyName
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...Sv: AssemblyName
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.
//AndreasSv: AssemblyName
<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 :) )Sv: AssemblyName
XAML mappar upp XML namespaces mot Namespace/Assembly par genom att göra följande
<?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