【问题标题】:Reference external DLL in .NET Core project在 .NET Core 项目中引用外部 DLL
【发布时间】:2016-10-18 12:20:36
【问题描述】:

我有自己的 .dll 文件,我曾经在 nodejs 中与 Edge.js 一起使用, 我现在正在尝试将它与 dot net core 应用程序一起使用,但没有找到/没有如何访问它或定义它。

有没有类似的东西

"files":
{
    "":"MyLibrary.dll"
}

或喜欢

using MyLibraryFile.dll

这样我就可以使用里面的功能了吗?

我的程序集文件结构是: MyLibraryFile.dll

namespace MyLibrary
{
    public class Inventory
    {
        public async Task<object> Invoke(object input)
    {
}

既不是using MyLbrary;也不是using MyLbraryFile;worked

我需要将它与 MS Code 编辑器一起使用,而不是与 MS Studio 一起使用。 并且不想使用NuGet package

【问题讨论】:

  • 我对.net core不熟悉,但你不能像在普通项目中一样引用它吗?
  • 不,using MyLibrary; 无法工作
  • 不是using,项目的参考部分,就在“属性”下面。
  • 这是 MS Visual Studio 的一部分,我只需要在 VS Code 中使用它。

标签: c# .net-core


【解决方案1】:

.Net Core 2 支持直接引用外部 .dll(例如 Net Standard 库、经典 .Net Framework 库)。您可以通过 Visual Studio UI 进行操作:右键单击 Dependencies-&gt;Add reference-&gt;Browse 并选择您的外部 .dll

或者,您可以编辑.csproj 文件:

<ItemGroup>
  <Reference Include="MyAssembly">
    <HintPath>path\to\MyAssembly.dll</HintPath>
  </Reference>
</ItemGroup>

您可能会遇到以下错误:

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集

然后只需删除 \bin 文件夹并重建项目。它应该可以解决问题。

怎么可能

Net Core 2.0 支持.Net Standard 2.0Net Standard 2.0 提供了一个compatibility mode 来连接.Net Core(.Net Standard) 和.NET Framework。它可以重定向引用,例如到System.Int32mscorlib.dll(Net.Framework) 到System.Runtime.dll(Net.Core)。但是,即使您的 net core 应用程序成功编译并依赖于外部 dll,如果外部库使用了 .Net Standard 没有的任何 API,您在运行时仍然可能存在兼容性问题。

【讨论】:

  • 添加了无法加载的引用。按照建议重建项目对我有用
  • 谢谢,在我的情况下,我使用的是 Azure DevOps,并且 git 上不存在包含外部程序集的 lib 文件夹。复制后,它工作得很好。
  • 如何调试这个添加到asp.net核心项目中的引用dll?我有一个针对 4.7 .net 框架的类库和一个 asp.net 核心项目都添加到同一个解决方案中,并且这个 asp..net 核心在运行 asp.net 核心应用程序时引用了这个类库 dll,断点永远不会被命中。有什么想法吗?
  • 我在 Visual Studio 2019 中有一个 .NET Core 3.1 项目,并且没有“依赖项 > 添加引用 > 浏览”选项。我看到的只是“添加项目引用”、“添加共享项目引用”和“添加 COM 引用”。
  • 愚蠢地现在在“添加项目参考”->浏览
【解决方案2】:
  • .NET Core 只能通过 Nuget 处理依赖项。 How do I import a .NET Core project to another .NET Core project in Visual Studio?Referencing standard dlls from a .NET Core XUnit project 相关。

  • 使用 VS Code,您可以添加对 Nuget 包修改 project.json 文件的引用。查看“依赖项”部分

    一个定义项目包依赖的对象,这个对象的每个键是一个包的名称,每个值都包含版本信息。有关详细信息,请参阅 NuGet 文档站点上的依赖关系解析文章。

    更新:从 .NET Core 1.1 开始,您需要通过添加 &lt;PackageReference&gt; 部分来修改 .csproj 文件。例如:

    <ItemGroup>
     <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="MySql.Data" Version="6.9.9" />
    </ItemGroup>
    
  • 在 C# using 中添加命名空间,而不是对程序集的引用。


【讨论】:

  • 奇怪的是,我使用的是 .net core 1.0,它运行良好。然后我更新了我的框架,但无法引用外部程序集。它直接抛出程序集未找到异常。
  • 真正不方便的是,您可以在 C# 项目中执行“添加引用”,只需指向一个 .NET Core 程序集 dll(您自己创建的),它就会很好地引用它,智能感知将为它工作。但是应用程序不会运行,因为引用的 dll 没有加载(它不在 TRUSTED_PLATFORM_ASSEMBLIES 中,如果您设置环境变量 COREHOST_TRACE =1,您将看到它)。所以你花了一个下午的时间来弄清楚为什么 VS Add Reference 不起作用。谢谢女士。
【解决方案3】:

在 Visual Studio 导航解决方案资源管理器中:

  1. 在引用中右键单击 -> 添加引用
  2. 在文件资源管理器中寻找您的 dll,选择并点击接受按钮
  3. 再次编译。

VS Add dll to project

【讨论】:

    【解决方案4】:

    您可以使用以下代码添加一个dll:

    [DllImport("MyLbraryFile.dll", SetLastError = true, CharSet = CharSet.Auto)]
    

    你所要做的就是把dll放在同一个目录中。

    https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute(v=vs.110).aspx

    【讨论】:

    • 你为什么接受这个答案?这看起来不像非托管 DLL。它看起来像一个 .net 程序集。还有@Leon,你为什么决定这是一个非托管DLL,更令人惊讶的是,你为什么选择SetLastError = true?看起来您只是从某个地方复制了它,而没有真正考虑其含义。是什么让你相信这个 DLL 确实调用了 Win32 SetLastError() 函数?
    • @DavidHeffernan 是的,你的权利,我从我自己的项目中复制了这一行。我在那里使用 vb.net dll,这就是我使用 SetLastError = true 的原因。 Indeet 这不是针头在这里。我认为他接受了这个答案,因为它符合他的目的。
    • 和什么目录一样?解决方案、项目、类文件目录?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2021-03-02
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多