【问题标题】:Missing DLL's own dependencies in consuming projects在消费项目中缺少 DLL 自身的依赖项
【发布时间】:2019-10-30 11:23:51
【问题描述】:

我使用 C# 和 .Net 创建了一个类库项目。

在这个项目中,我使用了两个外部依赖项(更具体地说:Microsoft.Win32.Registry(4.6.0) 和 System.Data.SqlClient(4.7.0) Nuget 包)。

构建这个项目后,我可以在 /bin/debug 文件夹下看到生成的 DLL 文件。

现在我想在另一个项目中导入这个生成的 DLL 并使用它的方法。导入并运行此项目后,它抱怨无法找到我在类库项目中拥有的这两个外部依赖项。

作为临时修复,我可以在这个项目中导入这两个缺失的引用,它会正常工作并按预期工作。但这不是我想要的(我想这也不是一个干净的解决方案)。

我想知道为什么类库项目的依赖没有反映在生成的dll文件中?有没有办法解决这个问题?

非常感谢您的帮助。

【问题讨论】:

  • want to import this generated DLL in another project ,您使用哪种方式导入引用?可以添加项目参考帮助这种情况吗?目标是 .net 核心还是 .net 框架?
  • 我这样做:右键单击依赖项,然后添加引用,然后浏览生成的 dll 并添加它。添加后,它会出现在依赖项下。
  • 目标:.net 框架
  • 在此处查看答案:stackoverflow.com/questions/42775876/… 在我的案例中有所帮助

标签: c# .net dll dependencies nuget


【解决方案1】:

如果您的类库与使用它的应用位于同一解决方案或源代码控制存储库中,则应使用project-to-project reference,而不是直接引用程序集。正如文档所说,通过这种方式,它会在您编译应用程序时自动检测对类库的更改,但文档没有说的是依赖关系也会流动。

否则,正如 Lance Li 所写,您应该从您的类库中创建一个 NuGet 包。不幸的是,入门有一点障碍。 Creating the package 很简单,但是您需要在某处发布nupkg 文件。对于早期开发(在包准备好共享之前),最简单的选择是使用local file feed。然后,您需要在应用程序中使用 nuget.config,该应用程序将使用该包将该本地提要添加为源,然后您可以在您的消费项目中使用 install the package,这将带来依赖关系。

如您所见,对于开发而言,这既缓慢又困难,因为如果您的消费应用程序在您的包中发现了一个错误,或者您尝试同时在消费应用程序和类库中开发新功能时间,这意味着每次对类库进行代码更改时,都需要增加版本号,打包一个包,发布包,然后更新消费项目中的包版本。使用ProjectReference 要容易得多,它可以让您简单地编辑代码、编译、运行。没有什么可考虑的了。

【讨论】:

  • 感谢您的解释。我很感激。我仍然想知道为什么不可能有一个包含所有依赖项的 dll?假设我刚刚开发了那个 dll,我想对消费者隐藏它的功能。这也是我不想再更改代码了。另一方面,我完全了解创建 nuget 包的过程,并且我知道它毕竟是有效的。但正如你提到的,这不是一个很容易遵循的方法。将此与只有一个 dll 进行比较,该 dll 可以简单地分发到任何想要使用它的设备。我错了吗?
  • 可以,但是构建系统仍然需要知道如何/在哪里找到所有依赖项。由于您的两个依赖项都是内置于运行时的程序集,因此您可能能够引用程序集(无路径或版本)而不是包引用,但这可能取决于您是否针对 .NET Standard。另一种可能性是将程序集的依赖项与程序集放在同一目录中,以便ResolveAssemblyReferences 有机会发现它们。
【解决方案2】:

请参阅this,当两个项目都在同一台机器上时,您引用该程序集的方式不是推荐的方式。

您正在使用文件引用(添加引用 => 浏览...)。这就是为什么你必须在这个项目中手动导入这两个缺失的引用。

所以我建议你添加项目引用,如果两个项目在同一个解决方案中,你可以right-click current project=>add reference=>project tab find that assembly you need。(而不是浏览...)

如果引用的项目不在同一个解决方案中。在解决方案资源管理器中右键单击解决方案=>添加现有项目以将其导入。然后添加项目引用。

【讨论】:

  • 感谢您的回复。但这不是我想要的。我想拥有一个包含所有必要依赖项的 dll,然后在任何机器(不仅是我的机器)上使用该 dll。
  • @EhSan 根据您的描述,您需要从您引用的项目中创建一个 nuget 包。创建的 nuget 包(您可以将其视为 xx.zip 文件)将包含您的程序集以及您的程序集所依赖的 nuget 包的定义。然后任何机器上的任何项目使用您创建的包都可以轻松引用这些程序集。
  • 谢谢。我确认 Nuget 包创建适用于这种情况。但是,我仍然想知道是否可以使用 dll 而不是包来做到这一点?
  • 如果你想要没有 nuget 包的组装方式,你必须手动复制和导入缺少的程序集......我不知道没有使用 nuget 的任何方法...... :(跨度>
猜你喜欢
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2010-09-13
  • 2011-05-14
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多