首页 文章

依赖DLL未被复制到Visual Studio中的生成输出文件夹

提问于
浏览
145

我有一个visual studio解决方案 . 我在解决方案中有很多项目 . 有一个主要项目作为启动并使用其他项目 . 有一个项目说“ProjectX” . 它的参考被添加到主项目中 . ProjectX引用了另一个不是解决方案的.NET dll(例如abc.dll) .

现在这个abc.dll应该被复制到主项目的bin / debug文件夹中,但它不会被复制到那里 . 为什么不被复制,任何已知的原因?

16 回答

  • 0

    您可以将主项目和ProjectX的构建输出路径设置为同一文件夹,然后您可以获得该文件夹中所需的所有dll .

  • 10

    除了上面常见的,我有一个多项目解决方案发布 . 显然有些文件针对不同的框架 .

    所以我的解决方案:属性>特定版本(假)

  • 0

    这是对nvirth示例的轻微调整

    internal class DummyClass
    {
        private static void Dummy()
        {
            Noop(typeof(AbcDll.AnyClass));
        }
        private static void Noop(Type _) { }
    }
    
  • 0

    NO NEED FOR DUMMY IN CODE
    只是:

    添加对可执行项目的引用

    或/并确保可执行项目中的引用 "Copy Local" 设置为 TRUE (这是我的“错误”)似乎这个"overwrote"基础引用库项目中的设置...

  • 1

    将DLL作为现有项添加到其中一个项目中,并应对其进行排序

  • 0

    我会将它添加到Postbuild事件,以将必要的库复制到输出目录 . 像XCopy pathtolibraries targetdirectory

    您可以在项目属性 - >构建事件中找到它们 .

  • 14

    确保您使用的依赖dll没有比项目应用程序的目标.net框架更高的目标.net框架 .

    您可以通过选择项目来检查,然后按ALT ENTER,然后从左侧选择Application,然后选择项目的Target Framework .

    假设,依赖dll Target Framework = 4.0和Application dll Target Framework = 3.5然后将其更改为4.0

    谢谢!

  • 0

    如果您正确单击引用的程序集,您将看到名为 Copy Local 的属性 . 如果Copy Local设置为true,则程序集应包含在bin中 . However ,接口是Visual Studio的一个问题,有时它不包含bin文件夹中引用的dll ...这是对我有用的解决方法:

    enter image description here

  • 21

    我发现如果ProjectX引用了abc.dll但没有直接使用abc.dll中的任何DEFINED类型,那么abc.dll将不会被复制到主输出文件夹 . (它将被复制到ProjectX输出文件夹,使其更加混乱 . )

    因此,如果你没有在ProjectX中的任何地方明确使用abc.dll中的任何类型,那么在ProjectX中的一个文件中的某处放置一个虚拟声明 .

    AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied
    

    您不需要为每个类执行此操作 - 只需一次就足以使DLL复制并且一切都按预期工作 .

    Addendum: 请注意,这可能适用于调试模式,但不适用于发布 . 有关详细信息,请参阅@nvirth的答案 .

  • 1

    是的,您需要将 Copy Local 设置为 true . 但是, I'm pretty sure 您还需要从主项目引用该程序集并将 Copy Local 设置为 true - 它不仅仅是从依赖程序集中复制的 .

    您可以通过单击 References 下的程序集并按F4来访问 Copy Local 属性 .

  • 47

    只是对霸王Zurg的回答的旁注 .

    我已经以这种方式添加了虚拟引用,并且它在调试模式下工作:

    public class DummyClass
    {
        private static void Dummy()
        {
            var dummy = typeof(AbcDll.AnyClass);
        }
    }
    

    但在发布模式下,依赖的dll仍然没有被复制 .
    然而,这有效:

    public class DummyClass
    {
        private static void Dummy()
        {
            Action<Type> noop = _ => {};
            var dummy = typeof(AbcDll.AnyClass);
            noop(dummy);
        }
    }
    

    这个信息实际上花了我几个小时来弄清楚,所以我想我分享它 .

  • 0

    当你使它成为一个组件属性时,它看起来很光滑

    [AttributeUsage(AttributeTargets.Assembly)]
    public class ForceAssemblyReference: Attribute
    {        
        public ForceAssemblyReference(Type forcedType)
        {
            //not sure if these two lines are required since 
            //the type is passed to constructor as parameter, 
            //thus effectively being used
            Action<Type> noop = _ => { };
            noop(forcedType);
        }
    }
    

    用法将是:

    [assembly: ForceAssemblyReference(typeof(AbcDll.AnyClass))]
    
  • 44

    进入同样的问题 . 背景信息:在构建之前,我在解决方案中添加了一个新的Project X.项目Y依赖于项目X,项目A,B,C依赖于项目Y.

    构建错误是无法找到项目A,B,C,Y和X dll .

    Root cause was that newly created Project X targeted .NET 4.5 while the rest of the solution projects targeted .NET 4.5.1. 项目X没有构建,导致其他项目也没有构建 .

    Make sure any newly added Projects target the same .NET version as the rest of the solution.

  • 91

    不确定这是否有帮助,但对我来说,很多时候我引用了一个DLL(当然会自动将它添加到bin文件夹中) . 但是,该DLL可能需要额外的DLL(取决于我正在使用的功能) . 我不想在我的项目中引用它们,因为它们只需要与我实际使用的DLL相同的文件夹 .

    我通过“添加现有文件”在Visual Studio中完成此操作 . 除了Add_data文件夹之外,您应该可以将它添加到任何位置 . 我个人只是将它添加到根目录 .

    然后将该文件的属性更改为...

    Build Action = None(将此设置为内容实际上将“root”版本复制到根目录,再加上Bin中的副本) .

    复制到输出文件夹=如果更新则复制(基本上只有在缺少时将其放在BIN文件夹中,但之后不执行)

    当我发布时...我添加的DLL仅存在于BIN文件夹中而在Publish位置中没有其他地方(这就是我想要的) .

  • 15

    您还可以检查以确保您要查找的DLL未包含在GAC中 . 我相信,如果构建计算机上的GAC中已经存在这些文件,那么Visual Studio很聪明 .

    我最近遇到过这种情况,我一直在测试一个需要在GAC中存在程序集的SSIS包 . 我已经忘记了这一点,并想知道为什么这些DLL在构建期间没有出现 .

    要检查GAC中的内容(从Visual Studio Developer命令提示符):

    gacutil -l
    

    或者输出到文件以便于阅读:

    gacutil -l > output.txt
    notepad.exe output.txt
    

    要删除程序集:

    gacutil -u MyProjectAssemblyName
    

    我还应该注意,一旦我从GAC中删除了文件,它们在构建后正确地输出到\ bin目录中(即使对于根项目中没有直接引用的程序集) . 这是在Visual Studio 2013 Update 5上 .

  • 0

    在我的情况下,这是最愚蠢的事情,由我不同意的TFS / VS的默认行为引起 .

    由于添加dll作为对主项目的引用不起作用,我决定将其添加为“现有项目”,复制本地=始终 . 即便如此,文件也不存在 .

    事实证明,即使文件存在于VS解决方案上,并且所有内容都在本地和服务器上编译,VS / TFS也没有添加实际添加文件到源代码控制 . 它根本没有包含在“待定变更”中 . 我不得不手动转到Source Control Explorer并明确单击“Add items to folder”图标 .

    愚蠢因为我在VS中已经发展了15年 . 我之前遇到过这种情况,我只是不记得了,不知怎的,我错过了它因为文件是常规引用所有仍然编译,但是作为现有项添加的文件没有被复制,因为它不存在于源控制服务器 .

    我希望这能节省一些时间,因为我失去了2天的生命 .

相关问题