c#调用c写的dll时DllNotfoundexception的错误

dongzhm_ctbri 2010-06-12 05:07:54
namespace DllTest
{
public class TestCallC_dll
{
[DllImport("LTM8901DC.dll", CharSet = CharSet.Ansi)]
public static extern int LTM8901DC(string portNum, int bandrate, int address, double temp, double humidity);
}
public partial class Form1 : Form
{
public int mResult;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
double tem = 0, hum = 0;
mResult = TestCallC_dll.LTM8901DC("COM6", 9600, 0, tem, hum);
switch(mResult){
case 1:
Console.WriteLine("通讯成功," + "tem:" + tem + "hum:" + hum);
break;
case -1:
Console.WriteLine("串口初始化未成功");
break;
case -2:
Console.WriteLine("命令发送失败");
break;
case -3:
Console.WriteLine("数据接收失败");
break;
case -4:
Console.WriteLine("数据格式错误");
break;
}
}
}
}

结果在mResult = TestCallC_dll.LTM8901DC("COM6", 9600, 0, tem, hum);
处提示:
未处理DllNotFoundException
无法加载DLL “LTM8901DC.dll”:找不到指定的模块。(异常来自
HRESULT:0X8007007E)
哪位大侠遇到过啊?????
帮忙看一下
...全文
646 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
只在此山中 2010-06-14
  • 打赏
  • 举报
回复
[DllImport("LTM8901DC.dll",CallingConvention:=CallingConvention.Cdecl)]
public static extern int LTM8901DC(string portNum, int bandrate, int address, ref double temp, double humidity);
zhu_jiang 2010-06-13
  • 打赏
  • 举报
回复
估计是dll问题。提几个建议
extern "C" int __declspec(dllexport)HookException();
我猜测有几个原因,楼主请参考
1.vc里面写的导出函数,如果不加"C"进行导出,那么导出函数名称将不是原来的名称,请楼主检查。
2.在dll中BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved{
CGlobal* glb = CGlobal::GetInstance();
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
glb->_ExceptionCounter = 0;

glb->_lpContext = new CVehLogContext(hModule);

glb->_lpLogWriter = CLogWriterFactory::GetILogWriter(glb->_lpContext);

SetExceptionHash();

glb->_lpVeh = new CVeh();

glb->_lpDbgHelp = new CDbghelp();
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;

case DLL_PROCESS_DETACH:
glb->~CGlobal();
break;
}
return TRUE;


请注意没一个case,都要使用break,否则loadlibrary时候获取不到模块句柄。

3.另外的问题采用 ref double解决,也可以传个指针intptr
Jellyfancy 2010-06-13
  • 打赏
  • 举报
回复
肯定不对。。
应该是 ref double 吧试试看
dongzhm_ctbri 2010-06-13
  • 打赏
  • 举报
回复
大家请看,
我的dll是用C写的函数,函数原型里有个 参数 是double* temperature
我在C#里该怎么传参数啊?,我之前传的是double temperature,这样做是不是不对啊?
如果是这里的错误,该如何解决啊?
zhuazhuqingchong 2010-06-13
  • 打赏
  • 举报
回复
你dll本身有没有逻辑错误?
dongzhm_ctbri 2010-06-13
  • 打赏
  • 举报
回复
换成CharSet = CharSet.Auto也不行

“DllTest.exe”: 已加载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”,未加载任何符号。
“DllTest.exe”: 已卸载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”
“DllTest.exe”: 已加载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”,未加载任何符号。
“DllTest.exe”: 已卸载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”
“DllTest.exe”(托管): 已加载“C:\WINDOWS\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,未加载符号。
在 System.DllNotFoundException 中第一次偶然出现的“DllTest.exe”类型的异常
线程 'Win32 线程' (0xcfc) 已退出,返回值为 0 (0x0)。
只在此山中 2010-06-13
  • 打赏
  • 举报
回复
[DllImport("LTM8901DC.dll", CharSet = CharSet.Auto)]
public static extern int LTM8901DC(string portNum, int bandrate, int address, double temp, double humidity);
dongzhm_ctbri 2010-06-13
  • 打赏
  • 举报
回复
楼上的各位,多谢回复:
dll是用C写的,函数原型是int LTM8901DC(char* portNumber , int baudrate, int address, double* temperature, double *humidity)
我把LTM8901DC.dll放在\DllTest\bin下和\DllTest\bin\Debug下,还放在了windows\system32下了,
环境变量PATH也设置上C:windows\system32了,但是还是提示下面的东西:到底还有啥错误啊???
我在C#里调用时候写的有错误么?



“DllTest.exe”: 已加载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”,未加载任何符号。
“DllTest.exe”: 已卸载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”
“DllTest.exe”: 已加载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”,未加载任何符号。
“DllTest.exe”: 已卸载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”
“DllTest.exe”(托管): 已加载“C:\WINDOWS\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,未加载符号。
在 System.DllNotFoundException 中第一次偶然出现的“DllTest.exe”类型的异常
hshxf 2010-06-12
  • 打赏
  • 举报
回复
1、把你的dll放到system32下
2、把你的dll的路径放到环境变量中
3、把你的dll放到你应用程序的目录下
盜令玊 2010-06-12
  • 打赏
  • 举报
回复
是不是你的LTM8901DC.dll没有放在你的生成目录下啊……
qqiuzaihui 2010-06-12
  • 打赏
  • 举报
回复
没有找到LTM8901DC.dll这个动态库文件呢, 你把这文件放哪了?
Jellyfancy 2010-06-12
  • 打赏
  • 举报
回复
楼上说的对


[DllImport("LTM8901DC.dll", CharSet = CharSet.Ansi)]
public static extern int LTM8901DC(string portNum, int bandrate, int address, double temp, double humidity);
但也有可能是函数参数类型没有完全对应。。

把LTM8901DC.dll的该函数声明贴出来:
皇城龙三 2010-06-12
  • 打赏
  • 举报
回复
就像提示说的,DLL加载没有成功

看看你dll的路径是否正确

还有LTM8901DC.dll是否已经拷贝到项目文件夹下或者系统文件夹下

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧