在.net C#里调用非托管动态库函数dll(转)

博客讲述了在C#中调用Dog.dll里的DogIsValid函数时,出现无法在DLL中找到入口点的报错情况。Dog.dll由VC6开发且已确认函数可导出,代码使用DllImport调用该函数,后续给出解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个动态库:Dog.dll中个函数(只有这个函数):int DogIsValid() ,用VC6开发确认已经导出来,也就是说在别的地方能调用。

然后在C#里用如下代码调用:

using System.Runtime.InteropServices;

[DllImport("Dog.dll")] public static extern int DogIsValid();

再在函数中使用

private void Page_Load(object sender, System.EventArgs e) {

// 在此处放置用户代码以初始化页面

if(DogIsValid() != 1) { lbErrorMsg.Text = "加密狗不存在。"; } }

报错:无法在 DLL Dog.dll 中找到名为 DogIsValid的入口点。

解决方案:

.Net提供了类型库导入程序(Tlbimp.exe),将在 COM 类型库中找到的类型定义转换为托管元数据格式中的等效定义。 先转换吧,然后在项目中引用Dog.dll

可能你的: [DllImport("Dog.dll")] public static extern int DogIsValid(); 要该为: [DllImport("Dog.dll")] static extern int DogIsValid(); 去掉public 这里有一个类试的解决方法: 这里讲述的是C#调用标准动态库的问题, 在我以前的文件中讲到过, C#调用Win32API, 原理是一样的. 这里我详细讲解用C写一个标准的动态库, 然后让C#调用. (本篇适合初学者, 中间没有任何冗余代码, 简洁明了) 软件环境: VC6.0(当然其他版本的VC5也可以) 1.制作标准动态库 __declspec(dllexport) int __cdecl add(int, int);//这一句是声明动态库输出一个可供外不调用的函数原型. int add(int a,int b) {//实现这个函数 return a+b; } 以上简单3行代码,声明一个add的方法, 输入参数是两个int参数,返回这两个数之和. 保存为MyLib.c 然后执行编译命令. H:/XSchool/C#-School/HowTo>cl /LD MyLib.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. MyLib.c Microsoft (R) Incremental Linker Version 6.00.8447 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /out:MyLib.dll /dll /implib:MyLib.lib MyLib.obj Creating library MyLib.lib and object MyLib.exp 确信有以上输出, 说明编译成功生成了动态库. 2.编写C-Sharp程序调用该动态库 using System; using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包 public class InvokeDll { [DllImport("MyLib.dll", CharSet=CharSet.Auto)] static extern int add(int a,int b);//声明外部的标准动态库, 跟Win32API是一样的. public static void Main() { Console.WriteLine(add(10,30)); } } 保存为InvokeDll.cs文件, 与MyLib.dll置于同一目录, 编译该文件. H:/XSchool/C#-School/HowTo>csc invokedll.cs 将生成Invokedll.exe, 可以执行该文件.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值