调用DLL异常,C#新手,急寻帮助!

wl_ldy 2009-11-10 09:14:21
现在刚用到C#来调用DLL,我按照http://www.codeproject.com/KB/cs/usecdlllibincs.aspx#里面的例子一步步的做的,
先自己构造一个DLL,代码如下:
#include <stdio.h>

extern "C"
{
__declspec(dllexport) void DisplayHelloFromDLL()
{
printf ("Hello from DLL !\n");
}
}

接着又创建了一个c#应用程序(名称为HelloWorld)来调用DLL,代码如下:
using System;
using System.Runtime.InteropServices; // DLL support

class HelloWorld
{
[DllImport("TestLib.dll")]
public static extern void DisplayHelloFromDLL ();

static void Main ()
{
Console.WriteLine ("This is C# program");
DisplayHelloFromDLL ();
}
}

我把上面程序生成的TestLib.dll放在HelloWorld\bin\Debug目录下面,运行HelloWorld程序
报异常:
未处理BadImageFormatException
试图加载格式不正确的程序。(异常来自HRESULT:0X8007000B)

请各位帮帮忙啊,谢谢了!!
...全文
410 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
soaringbird 2009-11-11
  • 打赏
  • 举报
回复
无法加载DLL “Test4.dll“:找不到指定的模块。

路径不对、文件名不对、找不到所需的其他dll
wl_ldy 2009-11-11
  • 打赏
  • 举报
回复
最终还是没有解决问题,看来我的c#基础太差了,是该好好学习了!
godlxldog 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 soaringbird 的回复:]
看看你的项目属性里和编译配置里,是x64还是anycpu
[/Quote]
Dll 名称错了吧,好好检察一下
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 suenfai 的回复:]
看得有点晕,LZ最终调用的是哪个方法?原来的方法管用的话,试试将Dll文件注册一下,或者试试能不能直接引入Dll(如果是.Net Framework生成的Dll)
[/Quote]
调用的是 DisplayHelloFromDLL ();方法,DLL文件是通过C程序创建的。

辉太郎 2009-11-10
  • 打赏
  • 举报
回复
看得有点晕,LZ最终调用的是哪个方法?原来的方法管用的话,试试将Dll文件注册一下,或者试试能不能直接引入Dll(如果是.Net Framework生成的Dll)
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 soaringbird 的回复:]
看看你的项目属性里和编译配置里,是x64还是anycpu
[/Quote]
是 anycpu 的。
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
我把生成的DLL文件直接的拷到了HelloWorld\bin\Debug目录下面,现在又报
DLLNotFoundException的异常。
无法加载DLL “Test4.dll“:找不到指定的模块。
soaringbird 2009-11-10
  • 打赏
  • 举报
回复
看看你的项目属性里和编译配置里,是x64还是anycpu
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yangyanli 的回复:]
重新生成 DLL试下,是不是文件损坏了
[/Quote]
我的不行啊,是不是我生成DLL的方式不对啊。
yangyanli 2009-11-10
  • 打赏
  • 举报
回复
重新生成 DLL试下,是不是文件损坏了
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 soaringbird 的回复:]
我是说你可能是把C#程序设置成了编译成x64,而你的C dll是x86的,也可能相反。
[/Quote]
我以前没太接触过c#,不太懂啊,还请指点啊。
soaringbird 2009-11-10
  • 打赏
  • 举报
回复
我是说你可能是把C#程序设置成了编译成x64,而你的C dll是x86的,也可能相反。
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yangyanli 的回复:]
我试了下,正常

#include <stdio.h>

extern "C"
{
  __declspec(dllexport) void DisplayHelloFromDLL()
  {
    printf ("Hello from DLL !\n");
  }
}

[DllImport("TestLib2.dll")]
        public static extern void DisplayHelloFromDLL();


        static void Main(string[] args)
        {
            Console.WriteLine("This is C# program");
            DisplayHelloFromDLL();

        }

你那是什么问题...
[/Quote]
我这里报异常:

报异常:
未处理BadImageFormatException
试图加载格式不正确的程序。(异常来自HRESULT:0X8007000B)
yangyanli 2009-11-10
  • 打赏
  • 举报
回复
我试了下,正常

#include <stdio.h>

extern "C"
{
__declspec(dllexport) void DisplayHelloFromDLL()
{
printf ("Hello from DLL !\n");
}
}

[DllImport("TestLib2.dll")]
public static extern void DisplayHelloFromDLL();


static void Main(string[] args)
{
Console.WriteLine("This is C# program");
DisplayHelloFromDLL();

}

你那是什么问题...
qqiuzaihui 2009-11-10
  • 打赏
  • 举报
回复
引用: using System.Runtime.InteropServices;


[DllImport("Kernel32")] //读取动态库文件
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("Kernel32")]
public static extern int LoadLibrary(String funcname);
[DllImport("Kernel32")]
public static extern int FreeLibrary(int handle);


[DllImport("HmPark.dll")] //声明C++中的接口函数, 其中 HmPark 为你的动态库文件名
public static extern double GetStdCharge(UInt32 time_In, UInt32 time_Out);

private int huser32 = 0;
private void CountCharge()
{
double dCharge = 0;
try
{
huser32 = LoadLibrary("HmPark.dll"); //载入动态库
dCharge = GetStdCharge(time_In, time_Out); //调用 C++ 中的接口函数
}
catch (Exception ex)
{
MessageBox.Show("调用出错: " + ex.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
try
{
Inspect.FreeLibrary(huser32); //释放动态库文件, 否则会弹出异常
}
catch (Exception ee)
{
MessageBox.Show("释放出错: " + ee.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 soaringbird 的回复:]
x86、x64?
[/Quote]
x86的。。
wl_ldy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cwaspnet 的回复:]
C#调用C?
[/Quote]
是的。
honkerhero 2009-11-10
  • 打赏
  • 举报
回复
要指写dllimport的entrypoint属性和编码吧?你试试
cwaspnet 2009-11-10
  • 打赏
  • 举报
回复
C#调用C?
soaringbird 2009-11-10
  • 打赏
  • 举报
回复
x86、x64?
加载更多回复(1)

110,535

社区成员

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

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

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