У меня есть фреймворк, который состоит из множества базовых классов, которые могут быть производными для разработки многих приложений. Среди этих классов есть подкласс System.Windows.Forms.Panel, для которого я написал собственный конструктор. Все работает нормально с Visual Studio 2005, но что-то идет не так, когда я пытаюсь перейти на VS2010. Это намного упрощенная версия того, что я делаю:
У меня есть проект CoreClasse, который содержит интерфейс и два класса:
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;
}
}
Затем есть проект ConfClasses, который ссылается на CoreClasses и содержит только один класс, реализующий 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";
}
}
И, наконец, есть проект для элементов управления, который ссылается только на CoreClasses и содержит подкласс Panel и связанный с ним конструктор:
[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();
}
}
Теперь я создаю другое решение, которое ссылается на все эти dll и содержит пустой подкласс SimplePanel. Когда я дважды щелкаю по этому классу в SolutionExplorer, выполняется конструктор SimplePanelDesigner и вызывается метод LoadConf из ConfLoader. Это означает, что ConfClasses.dll загружается динамически и создается экземпляр ConfClass. До этого момента все в порядке, но при вызове InitFoo возникает это исключение:
Не удалось загрузить файл или сборку CoreClasses, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null или одну из их зависимостей. Система не может найти указанный файл.
Чтобы усложнить задачу, в этом примере на самом деле исключение не вызывается, но именно такие действия выполняет мое настоящее приложение, и я получаю исключение. Я понятия не имею, что здесь происходит. VS выполняет метод, который находится в CoreClasses. Почему он пытается снова его загрузить? И где это ищет? Я также проверил текущий AppDomain, но в его загруженных сборках есть CoreClasses, и он, похоже, не изменился.
Просто чтобы добавить больше деталей, каждый проект создается в общей папке (а не в обычном obj / debug папку внутри папки проекта), и на момент запуска теста на компьютере нет других копий моих dll. Затем копия всех упомянутых dll создается в серии папок в папке AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies моего пользовательского профиля, и, похоже, это то место, где VS ищет сборки при Assembly.Load. выполняется, и я могу найти там копию CoreClasses.Я попытался очистить все папки, перестроить все и оставить разные решения открытыми / закрытыми в каждой комбинации, но без каких-либо улучшений.
РЕДАКТИРОВАТЬ:
Как предложил GranMasterFlush, это FusionLog, созданный исключением:
=== 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
Чтобы добавить некоторую информацию, я взглянул на журналы слияния, сгенерированные моим простым примером, и обнаружил Выяснилось, что точно такой же журнал был создан при попытке загрузить CoreClasses, но каким-то образом VisualStudio находит способ справиться с этим.