1

我在程序集 A 中有以下类。程序集引用了 StructureMap 2.6.1。

public static class Bootstrapper
{
    public static void Bootstrap(string databaseName)
    {
        StructureMapBootstrapper.Bootstrap(databaseName);
    }
}

我在完全不同的程序集 (B) 中引用程序集 A,并且在调用此行时出现以下运行时错误:

Bootstrapper.Bootstrap(db);

运行时错误是:

FileNotFoundException:无法加载文件或程序集“StructureMap,Version=2.6.1.0,Culture=neutral,PublicKeyToken=e60ad81abae3c223”或其依赖项之一。该系统找不到指定的文件。

我经常不得不将 StructureMap.dll 复制到程序集 B 的 bin 目录中。这非常烦人。关于如何解决这个问题的任何建议?有人知道关于 AssemblyB 何时需要 AssemblyA 引用的程序集的一般规则吗?

谢谢!


感谢您的快速回复!我想过简单地添加 StructureMap 作为参考。然而,我在设计中的目标是从消费者那里抽象出底层实现。换句话说,Assembly B 将不知道 StructureMap 最终被使用的事实。另外,如果我是 GAC StructureMap,那么我会遇到部署问题吗?如果我将站点部署到其全局缓存中没有 StructureMap 的主机上,那么我将回到原点。我很好奇考虑到这个程序集引用问题,如何实现真正的抽象。

4

4 回答 4

2

有一个名为Refix的出色工具,您可以使用它来检查和修复您的依赖关系。

于 2010-06-22T16:26:28.173 回答
1

为避免复制 DLL,您可以将 StructureMap.dll 添加到您的项目中,并让 VS 在构建 AssemblyA 时自动将其复制到输出中。

或者,您可以使用 ILMerge 将 StructureMap.dll 合并到程序集 B,而不必担心复制它,因为程序集 B 将包含所需的所有 IL。

或者,您可以将 StructureMap.dll 添加到全局程序集缓存中,这应该允许 .NET 找到它而无需复制它。但是,IIRC,所有 GAC 程序集都需要强名称。

于 2010-06-20T04:40:41.273 回答
0

如果您希望 Assembly B 不知道对 StructureMap 的依赖,但也避免每次手动复制文件,您可以添加 StructureMap 作为对 Assembly A 的引用(正如其他人所说)并将两个项目的构建输出路径设置为同一目录(通过项目属性-> 构建选项卡)。这样,当程序集 A 也可以“看到”它时。

于 2011-10-14T05:52:37.053 回答
0

顺便说一句,由于程序集有一个强名称(您可以通过它的值来看到这一点PublicKeyToken),您可以将 StructureMap 程序集安装到GAC中,这将使其可用于运行在系统。这可能会解决您的问题。

至于在 GAC 中使用程序集进行部署,这取决于您计划如何部署。我假设这是一个 Winforms 应用程序,所以我还假设您将通过安装项目进行部署。如果是这种情况,那么很容易在项目中包含应该进入 GAC 的程序集,如果它不存在,它将安装在那里。

但是,要回答您的问题,程序集绑定和加载有些细微差别,但一般规则是在第一次加载包含的类型时加载程序集。只要引用的代码块位于活动堆栈帧上,就会加载类型。

最后一句话基本上可以归结为:当以下任一情况发生时,就会加载一个类型:

  • 加载了另一种类型,该类型使用相关类型作为实例或静态变量

例如,假设我有类型ABC

public class A
{

}

public class C
{

}

public class B
{
    private A myA;
    private static C myC;
}

当 typeB被加载时,它也会被加载,A因为它被用作实例变量,并且C会被加载,因为它被用作静态变量。

  • 将所讨论的类型用作局部变量、参数或调用另一个将其用作参数的函数的函数。
于 2010-06-20T04:40:51.523 回答