Wo kommt der Visual-Studio-look für Baugruppen?
Habe ich ein framework besteht aus einer Vielzahl von Basis-Klassen, die abgeleitet werden können, entwickeln viele apps. Zwischen diesen Klassen gibt es eine Unterklasse von System.Windows.Formen.Panel, für die ich schrieb, seinen eigenen designer. Alles ist in Ordnung arbeiten mit Visual Studio 2005, aber etwas geht schief, wenn ich versuche zu bewegen, um VS2010. Dies ist eine stark vereinfachte version von dem, was ich Tue:
Habe ich ein Projekt namens CoreClasse enthält ein interface und zwei Klassen:
public interface IConf
{
string foo { get; set; }
void InitFoo();
}
public class SimpleClass
{
public string foo;
}
public class ConfLoader
{
public static IConf LoadConf()
{
AssemblyName anAssemblyName = new AssemblyName("ConfClasses");
Assembly anAssembly = Assembly.Load(anAssemblyName);
IConf result = (IConf)anAssembly.CreateInstance("ConfClasses.ConfClass");
result.InitFoo();
return result;
}
}
Dann gibt es ein Projekt ConfClasses die Verweise CoreClasses und enthält nur eine Klasse Umsetzung IConf:
public class ConfClass : IConf
{
public SimpleClass confVal;
public string foo
{
get { return confVal.foo; }
set { confVal.foo = value; }
}
public void InitFoo()
{
confVal = new SimpleClass();
confVal.foo = "bar";
}
}
Und schließlich gibt es ein Projekt für die Kontrollen, die Verweise werden nur CoreClasses und enthält eine Unterklasse von Panel und die damit verbundene designer:
[Designer("MyControls.Design.SimplePanelDesigner", typeof(IRootDesigner))]
public class SimplePanel : Panel
{
public SimpleClass dummy = new SimpleClass();
}
public class SimplePanelDesigner : DocumentDesigner
{
public IConf DesignerConf;
public SimplePanelDesigner()
: base()
{
DesignerConf = ConfLoader.LoadConf();
}
}
Nun erstelle ich eine weitere Lösung, die Referenzen alle diese dlls und enthält ein leeres Unterklasse von SimplePanel. Wenn ich Doppelklick auf diese Klasse im SolutionExplorer der Konstruktor der SimplePanelDesigner ausgeführt und die Methode LoadConf von ConfLoader genannt wird. Dies bedeutet, dass ConfClasses.dll geladen wird dinamically und eine Instanz von ConfClass erstellt. Alles ist in Ordnung bis zu diesem moment, aber wenn InitFoo genannt wird diese Ausnahme ausgelöst wird:
Konnte nicht geladen, Datei oder assembly 'CoreClasses, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine seiner Abhängigkeiten. Das system kann nicht die angegebene Datei gefunden werden.
Machen die Dinge schwieriger, die Ausnahme ist eigentlich nicht raisedin diesem Beispiel, aber das ist genau die Art von Wartungsanleitungen meine echte app ausgeführt wird, und die exception die ich erhalte. Ich habe keine Ahnung, was hier geschieht. VS ist die Ausführung einer Methode, die in CoreClasses. Warum ist es zu laden versucht es wieder? Und wo ist es zu suchen? Ich habe in der aktuellen Anwendungsdomäne, auch, aber es hat CoreClasses unter seinen geladenen assemblies, und es scheint nicht zu ändern.
Nur um ein paar mehr details, jedes Projekt bauen Sie in einen gemeinsamen Ordner (nicht die übliche obj/debug-Ordner innerhalb des Projektordners), und es gibt keine andere Kopie von meinem dlls auf dem PC im moment starte ich meinen test. Dann eine Kopie der referenzierten dlls erfolgt in einer Reihe von Ordnern in AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies Ordner von meinem userprofile, und dies scheint der Ort VS sucht für die Baugruppen bei der Montage.Laden ausgeführt wird, und ich kann eine Kopie von CoreClasses es. Ich habe versucht, reinigen Sie alle Ordner, neu erstellen alles, und die verschiedenen Lösungen, die geöffnet/geschlossen, in jeder Kombination, aber ohne Verbesserung.
EDIT:
Als GranMasterFlush vorgeschlagen, dies ist die FusionLog generiert, die von der Ausnahme:
=== Pre-bind state information ===
LOG: User = FCDB\fc0107
LOG: DisplayName = XEngine.Core, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null (Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).
EDIT 2
Nur hinzufügen, dass einige info, ich habe einen Blick auf die fusion generierten Protokolle durch mein einfaches Beispiel, und fand heraus, dass genau die gleichen log generiert wurde, während Sie versuchen zu laden, CoreClasses, aber irgendwie VisualStudio einen Weg findet, damit umzugehen.
- Ich verwendete procmon, um sicherzustellen, dass die Datei es war, beschwerte sich über war eigentlich
AppData\Local\Microsoft\VisualStudio\11.0\ProjectAssemblies\<some temporary name>
. Am Ende war es weil mein benutzerdefiniertes Steuerelement versucht hatte zu Beginn einen thread (DesignMode
- Eigenschaft funktioniert nicht, siehe diese Lösung). Ich fand diese durch Anstrengungen, durch diesem Artikel, wie debug-design-Zeit-Verhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe gerade herausgefunden, was passiert. Der Unterschied zwischen dem einfachen Beispiel und die Reale Sache ist die Tatsache, dass es ein Add-in eingebunden.
Es ist schon eine log-Geschichte, aber das ist es.
Wie Sie sehen können aus dem code-Beispiel, ich lade die ConfClasses dll über Reflexion, um zu vermeiden, um einen Verweis hinzuzufügen. Dies ist gut an der Laufzeit, aber der designer beschwert sich sagen, dass es nicht in der Lage zu werfen IConf zu IConf. Dies geschieht, weil CoreClasses.dll wird geladen AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies, wenn der designer startet, aber ConfClasses.dll geladen ist mein bin Ordner und so sind seine Verweise, so gibt es zwei Versionen CoreClasses.dll und verschiedene Versionen von IConf.
Umgehen Sie das problem, das ich entwickelt, ein Add-in, dass, wenn ein assembly geladen wird, mit Montage.Laden Sie zur design-Zeit, fügt einen Verweis auf die assembly, und reinigt dann die Verweise bei den letzten designer-Fenster wird geschlossen.
Alles war OK mit VS2005, aber mit ProcMon.exe ich fand heraus, dass VS2010 einen neuen Ordner, wo die addins Blick für Baugruppen: Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\CommonExtensions\DataDesign
Ich kopierte meine Montage dort und alles funktioniert wieder. Jetzt ist es nur eine Frage der Suche nach einem Weg, um die Dinge dort manuell.
Haben Sie versucht, mit dem Assembly Binding Log Viewer zu untersuchen, warum dieser Fehler beim laden des assemblies?
http://msdn.microsoft.com/en-us/library/e74a18c4%28v=vs.71%29.aspx
Dort ist ein anderer Artikel hier über die Verwendung von:
http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx
EDIT:
Wo sind die DLL ' s gespeichert? Diese forum post details, die ein ähnliches problem-und das problem wurde auf die DLL verwiesen wird, nicht entweder in den GAC, executable-Verzeichnis oder einen Unterordner aus dem executable-Verzeichnis: