类库中的引用不会复制到正在运行的项目bin文件夹中

 可爱鼠标1985 发布于 2023-02-13 20:08

我有一个代表我的逻辑层的类库.对于那个库我已经为Google.Apis.Analytics.v3添加了一个nuget包 - 它安装了包及其所有依赖项.

我有一个控制台应用程序,它使用该逻辑类库(常规引用).一切都写得很好.

问题是在运行时它抛出了一个异常,即找不到Google.Apis.dll.此DLL是与nuget一起下载的依赖项.

检查BIN文件夹,我发现在类库bin文件夹中存在此DLL,但在控制台应用程序BIN文件夹中它不存在(而其他相关的DLL是).所以这意味着编译期间复制的并非所有引用.

我在网上搜索过,找到了所有不起作用的解决方法(比如手动编辑项目文件并删除该dll定义中的真正xml行).

我最终做的是将相同的nuget库添加到我的控制台应用程序 - 它可以工作,但感觉有点脏,而不是应该的方式.我认为控制台应用程序是客户谁应该从该逻辑类库获得它的服务,应该知道它的东西没有"客户"担心它.

此外,该控制台应用程序并不是唯一一个将使用该服务的人,我也计划使用该功能的网络应用程序 - 所以我需要将相同的nuget添加到该Web应用程序中 - 再次,感觉有点乱......

只有我吗?这是正确的方法吗?我正在考虑编写一个WCF项目来处理这个功能 - 但这似乎只是在功能方面的一些开销,并且可能会减慢我的工作流程,以便在我看来保持"更清洁".

我只是过度思考吗?

谢谢

1 个回答
  • 说明

    对于示例场景,假设我们有项目X,程序集A和程序集B.程序集A引用程序集B,因此项目X包含对A和B的引用.此外,项目X包含引用程序集A的代码(例如A. SomeFunction()).现在,您创建一个引用项目X的新项目Y.

    所以依赖链看起来像这样:Y => X => A => B.

    Visual Studio/MSBuild试图变得聪明,只将引用引入它检测为项目X所需的项目Y; 这样做是为了避免项目Y中的参考污染.问题是,由于项目X实际上不包含任何明确使用程序集B的代码(例如B.SomeFunction()),VS/MSBuild不会检测到B是必需的通过X,因此不会将其复制到项目Y的bin目录中; 它只复制X和A程序集.

    您有两个选项可以解决此问题,这两个选项都会导致程序集B被复制到项目Y的bin目录中:

      在项目Y中添加对程序集B的引用.

      将虚拟代码添加到项目X中使用程序集B的文件中.

    我个人更喜欢选项2,原因有两个.

      如果您将来添加另一个引用项目X的项目,则不必记住还包括对程序集B的引用(就像您必须使用选项1一样).

      你可以有明确的评论说明为什么虚拟代码需要存在而不是删除它.因此,如果有人确实删除了代码(比如使用查找未使用代码的重构工具),您可以从源代码控制中轻松地看到代码是必需的并恢复它.如果您使用选项1并且某人使用重构工具来清理未使用的引用,则您没有任何注释; 您将看到从.csproj文件中删除了引用.

    以下是我在遇到这种情况时通常会添加的"虚拟代码"示例.

        // DO NOT DELETE THIS CODE UNLESS WE NO LONGER REQUIRE ASSEMBLY A!!!
        private void DummyFunctionToMakeSureReferencesGetCopiedProperly_DO_NOT_DELETE_THIS_CODE()
        {
            // Assembly A is used by this file, and that assembly depends on assembly B,
            // but this project does not have any code that explicitly references assembly B. Therefore, when another project references
            // this project, this project's assembly and the assembly A get copied to the project's bin directory, but not
            // assembly B. So in order to get the required assembly B copied over, we add some dummy code here (that never
            // gets called) that references assembly B; this will flag VS/MSBuild to copy the required assembly B over as well.
            var dummyType = typeof(B.SomeClass);
            Console.WriteLine(dummyType.FullName);
        }
    

    2023-02-13 20:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有