C#采用DLLImport无法加载第三方Dll文件

本文介绍了使用DllImport加载非托管第三方API时遇到的问题及解决方法,包括以管理员身份安装软件、添加dll路径到环境变量及赋予VS管理员权限。

在引用第三方文件时,出现如下问题:
在这里插入图片描述
引用方式:
采用DllImport类加载非托管第三方API,调用托管方法。

  [DllImport("TLJY.dll", EntryPoint = "TLJY_Reset", CallingConvention = CallingConvention.Cdecl)]
  public static extern int TLJY_Reset(DevHandle hZHHK429);

解决方法:
1、以管理员身份安装第三方给的软件(如果第三方API在软件安装的目录内);
2、将dll的文件路径添加到环境变量中;
3、给VS运行环境管理员身份
(找到VS启动应用devenv.exe—>右键—>兼容性疑难解答—>疑难解答程序—>该程序需要附加权限—>测试程序—>是,为程序保留这些设置)。

非托管的:dll文件拷贝到bin目录下没有任何帮助,因为CLR会把文件拷贝到一个临时目录下运行,而CLR只会拷贝托管文件,而非托管的dll虽放在了bin下但不会被拷贝,故仍会出现无法加载的问题。

C# 开发中,使用第三方 DLL 文件是一个常见需求,尤其是在集成非托管代码或重用已有库功能时。根据不同的场景,有多种方式可以实现 DLL加载与调用。 ### 使用 `DllImport` 调用非托管 DLL 当需要调用非托管的 DLL(如 C 或 C++ 编写的库)时,通常使用 `DllImport` 属性来声明外部函数。这种方式适用于函数签名已知且 DLL 文件路径固定的情况。 ```csharp [DllImport("GetFile.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] static extern string GetFileData(string fileName); ``` 此代码片段声明了一个名为 `GetFileData` 的函数,该函数从 `GetFile.dll` 中导入,并使用 Unicode 字符集和 `StdCall` 调用约定[^1]。 ### 动态加载 DLL 文件 如果 DLL 文件的路径不是固定的,或者需要在运行时动态决定加载哪个 DLL,可以使用 `System.Reflection` 命名空间中的类来动态加载 DLL。以下是一个使用 `Assembly.LoadFile` 方法加载 DLL 并调用其方法的示例: ```csharp string dllPath = @"D:\LandGZ_ShangTi.dll"; Assembly assembly = Assembly.LoadFile(dllPath); Type type = assembly.GetType("LandGZ_ShangTi.Class1"); MethodInfo method = type.GetMethod("MyMethod"); object result = method.Invoke(Activator.CreateInstance(type), null); ``` 在这个例子中,首先通过 `Assembly.LoadFile` 方法加载指定路径的 DLL 文件,然后获取该 DLL 中的类型和方法,并通过 `MethodInfo.Invoke` 方法调用该方法[^2]。 ### 使用 SQLite 第三方库 对于某些特定的第三方库,如 SQLite,可以直接通过 NuGet 包管理器安装相应的库,然后在项目中引用这些库。以下是一个使用 SQLite 的简单示例: ```csharp private void Button_Click(object sender, RoutedEventArgs e) { string appDir = $@"{Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)}\myTest"; if (!Directory.Exists(appDir)) { Directory.CreateDirectory(appDir); } string databaseName = "test.db"; string dbPath = appDir + @"\" + databaseName; MessageBox.Show("1"); m_sqlConnection = new SQLiteConnection("data source=" + dbPath); m_sqlConnection.Open(); SQLiteCommand cmd = new SQLiteCommand(m_sqlConnection); cmd.CommandText = "CREATE TABLE IF NOT EXISTS t1(id varchar(4),score int)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO t1 VALUES('99999',11)"; cmd.ExecuteNonQuery(); MessageBox.Show("2"); } ``` 这段代码展示了如何创建数据库连接、执行 SQL 命令以及处理数据库操作的基本流程[^3]。 ### 打包第三方 DLL 当需要将项目与第三方 DLL 一起发布时,确保所有依赖项都包含在安装包中是非常重要的。可以通过 Visual Studio 的 Setup 项目或其他安装包工具(如 WiX Toolset)来实现这一点。确保在构建安装包时,所有必要的 DLL 文件都被正确地包含并放置在目标机器的适当置。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值