C# Visual Studio在哪里查找程序集?

C# Visual Studio在哪里查找程序集?,c#,visual-studio-2010,windows-forms-designer,C#,Visual Studio 2010,Windows Forms Designer,我有一个由许多基类组成的框架,这些基类可以用来开发许多应用程序。在这些类中,有一个子类System.Windows.Forms.Panel,我为其编写了自己的设计器。VisualStudio2005一切正常,但当我尝试迁移到VS2010时,出现了一些问题。这是我正在做的事情的简化版本: 我有一个名为CoreClasse的项目,其中包含一个接口和两个类: public interface IConf { string foo { get; set; } void InitFoo()

我有一个由许多基类组成的框架,这些基类可以用来开发许多应用程序。在这些类中,有一个子类System.Windows.Forms.Panel,我为其编写了自己的设计器。VisualStudio2005一切正常,但当我尝试迁移到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,它引用CoreClass,只包含一个实现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";
    }
}
最后还有一个控件项目,它只引用CoreClass,并包含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的构造函数,并调用ConfLoader的LoadConf方法。这意味着将以动态方式加载ConfClasses.dll,并创建ConfClass的实例。到目前为止一切正常,但当调用InitFoo时,会引发此异常:

无法加载文件或程序集“CoreClasses,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件

更困难的是,这个例子中并没有出现异常,但这正是我真正的应用程序正在执行的指令,也是我得到的异常。我对这里发生的事一无所知。VS正在执行CoreClass中的方法。为什么它要再次加载它?它在哪里找呢?我也检查了当前的AppDomain,但它在加载的程序集中有CoreClasses,而且似乎没有改变

只是为了添加更多细节,每个项目都构建在一个公共文件夹中(而不是项目文件夹中通常的obj/debug文件夹),在我开始测试时,PC上没有其他DLL副本。然后在我的userprofile的AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblys文件夹中的一系列文件夹中复制所有引用的DLL,这似乎是VS在执行Assembly.Load时查找程序集的地方,我可以在那里找到CoreClass的副本。我试图清理所有文件夹,重建所有内容,并在每次组合中打开/关闭不同的解决方案,但没有任何改进

编辑:

正如GransMasterFlush所建议的,这是由异常生成的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).
编辑2


为了添加一些信息,我查看了由我的简单示例生成的fusion日志,发现在尝试加载CoreClass时生成了完全相同的日志,但是VisualStudio在某种程度上找到了解决方法。

您是否尝试过使用程序集绑定日志查看器来调查加载程序集失败的原因

这里还有一篇关于使用它的文章:

编辑:


DLL存储在哪里?这详细说明了一个类似的问题,问题是DLL没有被引用到GAC、可执行目录或可执行目录中的子文件夹中:

我刚刚知道发生了什么。简单示例和真实示例之间的区别在于,其中包含一个AddIn。 这是一个很好的故事,但就是这样。
正如您从代码示例中看到的,我通过反射加载ConfClasses dll,以避免向其添加引用。这在运行时很好,但设计者抱怨说它无法将IConf强制转换为IConf。之所以会发生这种情况,是因为在设计器启动时,CoreClasses.dll是从AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblys加载的,但ConfClasses.dll是从my bin文件夹及其引用加载的,因此有两个版本的CoreClasses.dll和不同版本的IConf。
为了绕过这个问题,我开发了一个加载项,当在设计时使用assembly.Load加载程序集时,它会向该程序集添加引用,然后在关闭最后一个设计器窗口时清除引用。
VS2005一切正常,但使用ProcMon.exe我发现VS2010添加了一个新文件夹,加载项在其中查找程序集:Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\CommonExtensions\DataDesign

我在那里复制了我的程序集,一切都恢复了正常。现在只需要找到一种方法手动添加内容。

我所有的项目都有一个文件夹设置为输出路径,因此所有DLL都位于同一文件夹中,这显然不是Visual Studio的文件夹。程序集不是从此文件夹加载的,而是从AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblys子文件夹中创建的副本加载的,在这里我可以找到所有程序集。我用于验证它抱怨的文件是否在
AppData\Local\Microsoft\VisualStudio\11.0\ProjectAssemblys\
中找到。最后,这是因为我的自定义控件试图启动线程(
DesignMode
property不起作用,请参见)。我通过苦读如何调试设计时行为发现了这一点。