C#报”DllNotFoundException”的原因以及解决办法

  • Post category:C#

当在 .NET 程序中调用某个 DLL 库时,如果找不到所需的 DLL,就会抛出 DllNotFoundException 异常。该异常通常发生在以下几种情况下:

  1. 文件路径不正确:当程序无法找到指定 DLL 的正确路径时,就会抛出此异常。可以通过检查 DLL 文件是否存在、路径是否正确来解决。如果该 DLL 文件存在,但是不能被正确加载,可以尝试将该 DLL 文件复制到程序运行的目录下,或添加该 DLL 文件的路径到系统环境变量中。

  2. 缺少依赖项:通常,一些 DLL 文件需要其他的 DLL 来支持其运行。当所需的依赖项缺失时,就会抛出 DllNotFoundException 异常。可以通过使用程序 Dependency Walker 工具来检查缺失的 DLL 哪些其他 DLL 是它的依赖项,然后将这些 DLL 文件添加到程序运行的目录中。

下面是两个示例:

示例 1: 文件路径不正确

using System.Runtime.InteropServices;
public class TestClass
{
    [DllImport("MyLibrary.dll")]
    public static extern void MyFunction(); 
    // 运行时出现 DllNotFoundException 异常
}

改成正确的路径:

[DllImport("C:\\MyLibrary.dll")]
public static extern void MyFunction(); 
// 或者
[DllImport("D:\\MyFolder\\MyLibrary.dll")]
public static extern void MyFunction(); 
// 或者将 MyLibrary.dll 文件复制到程序的输出目录或系统路径中

示例 2: 缺少依赖项

当你使用 NuGet 安装了某个库,并且需要从该库中使用方法或属性时,你可能会遇到类似的异常。例如,当你使用 Microsoft.Azure.Cosmos.Table 库时,可能需要添加 Microsoft.Azure.Cosmos.Table.dll 和 System.Threading.Tasks.Extensions.dll 两个依赖项才能运行。

using Microsoft.Azure.Cosmos.Table;
public class TestClass
{
    private static CloudStorageAccount storageAccount;
    static void Main(string[] args)
    {
        storageAccount = CloudStorageAccount.Parse("..."); // 运行时出现 DllNotFoundException 异常
    }
}

添加缺失的 DLL:

using Microsoft.Azure.Cosmos.Table;
using System.Threading.Tasks.Extensions;
public class TestClass
{
    private static CloudStorageAccount storageAccount;
    static void Main(string[] args)
    {
        // 添加缺失的依赖项
        // 在 NuGet 包管理器控制台中使用以下命令安装类库:
        // Install-Package System.Threading.Tasks.Extensions
        // 或者,手动将 System.Threading.Tasks.Extensions.dll 文件添加到程序输出目录中
        storageAccount = CloudStorageAccount.Parse("...");
    }
}

总之,DllNotFoundException 异常通常是由于文件路径或缺失依赖项导致的,通过检查路径或添加缺失的依赖项即可解决。