Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET程序集引用101_C#_.net_Assemblies_External Assemblies_Refix - Fatal编程技术网

C# .NET程序集引用101

C# .NET程序集引用101,c#,.net,assemblies,external-assemblies,refix,C#,.net,Assemblies,External Assemblies,Refix,我在程序集A中有以下类。该程序集引用了StructureMap 2.6.1 public static class Bootstrapper { public static void Bootstrap(string databaseName) { StructureMapBootstrapper.Bootstrap(databaseName); } } 我在完全不同的程序集(B)中引用程序集A,调用此行时出现以下运行时错误: Bootstrapper.

我在程序集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作为参考。然而,我在设计中的角度是将底层实现从使用者抽象出来。换句话说,程序集B将不知道StructureMap最终被使用的事实。此外,如果我添加StructureMap,那么我将uld会遇到部署问题,对吗?如果我将站点部署到全局缓存中没有StructureMap的主机上,那么我就回到原点。我很好奇在这个程序集引用问题下如何实现真正的抽象。

为了避免复制DLL,您可以将StructureMap.DLL添加到项目中,并使用VS autom在构建AssemblyA时,以语法方式将其复制到输出

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


或者,您可以将StructureMap.dll添加到全局程序集缓存中,这样就可以允许.NET在不复制的情况下找到它。但是,IIRC中,所有GAC程序集都需要强名称。

,因为程序集有一个强名称(您可以通过以下事实看到这一点:
PublicKeyToken
),您可以将StructureMap程序集安装到中,这样系统上运行的任何.NET应用程序都可以使用它。这可能会解决您的问题

至于在GAC中使用程序集进行部署,这取决于您计划如何部署。我假设这是一个Winforms应用程序,所以我也假设您将通过安装项目进行部署。如果是这样的话,那么很容易在项目中包括应该放在GAC中的程序集,并且如果它不存在

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

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

  • 加载另一个类型,该类型将有问题的类型用作实例或静态变量
例如,假设我有
A
B
C
类型

public class A
{

}

public class C
{

}

public class B
{
    private A myA;
    private static C myC;
}
加载类型
B
时,它还将加载
A
,因为它被用作实例变量,而
C
将被加载,因为它被用作静态变量

  • 将所讨论的类型用作局部变量、参数或调用另一个将其用作参数的函数的函数

有一个名为的优秀工具,可用于检查和修复依赖关系。

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