2017-11-05 3 views
1

Ich schaue mir an, wie die runtime locates assemblies und frage mich, ob es eine Möglichkeit gibt, nur den Pfad einer Baugruppe von Assembly.Load gefunden statt sie tatsächlich zu laden?Wie erhält man den Pfad einer Baugruppe, anstatt ihn zu laden?

Der Grund, warum ich das brauche, ist, weil AssemblyDefinition.ReadAssembly von Mono.Cecil einen Pfad direkt zu der Baugruppe erfordert und nicht zu dem zusätzlichen Aufwand gehen wird, um es für sich selbst zu finden. Ich möchte stattdessen die Funktionalitäten von Standard System.Reflection und Mono.Cecil kombinieren.

+0

Haben Sie 'Assembly.Location' versucht? – Dido

+0

Das würde funktionieren, aber dann würde die Assembly in die Anwendungsdomäne geladen werden. Ich möchte das vermeiden. –

Antwort

2

Mono.Cecil verwendet Assembly Resolver, um einen AssemblyDefinition von einem Assemblynamen zu erhalten.

AssemblyNameReference reference = AssemblyNameReference.Parse("Foo, Version=1.0.0.0"); 
DefaultAssemblyResolver resolver = new DefaultAssemblyResolver(); 
AssemblyDefinition foo = resolve.Resolve(reference); 
1

Neue Antwort

Sie könnten in der Lage sein Assembly zu verwenden. Leider bin ich nicht an meiner Entwicklungsmaschine, also kann ich das nicht testen. Aber AssemblyName wird in der mscorlib-Implementierung von Assembly.Load() verwendet.

Ich tauchte in die CoreCLR ein, um zu sehen, ob ich einen Einblick gewinnen konnte, wo der Resolver tatsächlich nach der Datei sucht, aber nicht erfolgreich war. Wenn dies nicht funktioniert, können Sie versuchen, selbst in die CLR einzutauchen, um Antworten zu erhalten. Ich verengte es bis zu einem FindAssembly Anruf

var assemblyName = new AssemblyName("YourAssembly versionwhateveretc"); 
var path = new Uri(assemblyName.EscapedCodeBase).LocalPath; 

Alte Antwort

Hat ReflectionOnlyLoading Arbeit für Sie?

Dies sollte Ihnen ermöglichen, die Assemblymetadaten zu prüfen/interagieren, ohne sie vollständig in die aktuelle Anwendungsdomäne zu laden.

+0

Ich habe es gestern versucht und habe diese Ausnahme: 'System.IO.FileLoadException: Kann die Abhängigkeit zu Assembly nicht lösen 'System.Core, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089', weil es nicht vorgeladen wurde. Bei der Verwendung der ReflectionOnly-APIs müssen abhängige Assemblys beim Ereignis ReflectionOnlyAssemblyResolve vorgeladen oder geladen werden. Ich möchte vermeiden, Baugruppen tatsächlich zu laden, wenn dies aufgrund verschiedener Komplexitäten möglich ist, von denen die meisten nicht einmal sicher sind, was sie sind. –

+0

Betrifft Ihre Leistung die Leistung oder verursacht das Laden der Baugruppe Probleme mit dem, was Sie versuchen zu tun? Eine weitere Option ist das Laden in eine neue App-Domain, um den Pfad zu erhalten. Schließen Sie dann die App-Domain. –

+0

Gute Frage. Was ich versuche, ist ein Schnittstellenmodul in die .NET API für eine Sprache neu zu schreiben, die ich mache, so dass es "Mono.Cecil" anstelle der Standardreflexion verwendet. Im Moment habe ich das Problem, dass das Kompilieren der Typen in nur 4 Assemblys ungefähr 0,6 Sekunden dauert, was verrückt ist. Ich habe mir nicht die Mühe gemacht zu messen, wie lange das Laden der Baugruppen über die Standardreflexion dauert, aber jetzt, da ich mich für ein Neuschreiben des Interop-Moduls entschieden habe, versuche ich so viel wie möglich zu vermeiden, die Standardreflexion zu berühren. –

Verwandte Themen