c文件代码为
#include <stdio.h>
void Print()
{
printf("dfdfdfd");
}
c#端调用
"..\\..\\CDll\\Arithmetic.dll"为编译好的c dll文件
[DllImport("..\\..\\CDll\\Arithmetic.dll", EntryPoint = "Print",CharSet=CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void Print();
static void Main(string[] args)
{
Console.WriteLine("start");
Console.ReadLine();
//这里调用报到不到入口点
Print();
}
帮忙的好心人注意下,我说的是c的dll不是c++,c++的网上有很多的解决方法我都看了!
还有就是我没分了,没办法!哎!
麻烦大家了!
最好能写点示例代码上来
还有就是,如果我这个dll要返回一个复杂类型,比如说自定义的一个结构体,那样可能吗?怎么在c#里面做类型转换
24 个解决方案
#1
c dll和c++dll有本质区别么??
#2
这样调用需要dll在def上输出符号,lz有没有在def上输出?
#3
up
#4
#include <stdio.h>
int Print()
{
int a=3;
return a;
}
static void Main(string[] args)
{
Console.WriteLine("start");
Console.ReadLine();
int s=print();
Console.Write(s);
}
#5
我看过c++的dll里面有一个宏的定义的__declspec(dllexport)或是直接在方法声明的地方加extern “C” __declspec(dllexport) 返回值 方法名()
但我试了下把这句话加在c里面,编译时就报错了!
哪位知道的具体一点好吗?先谢谢了!
我是实在找不到签案了才来问的!
#6
[DllImport("..\\..\\CDll\\Arithmetic.dll", EntryPoint = "Print",CharSet=CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
Auto改为ANSI试一下
#7
汗,颜色怎么没打上?!bug么?我操作有问题?经常这样
#8
你用什么编译器?
#9
文件扩展名为.c
使用def文件不让编译器改函数名字.
使用def文件不让编译器改函数名字.
#10
另外CallingConvention 通常应该为cdecl,你看一下编译选项 确定是stdcall还是cdecl
#11
我看了下自己的.c 编译的dll的调用约定是cdecl的,所以我改了,不过还是不行,还是报入口
按你的改过了,还是报这个!
#12
你用DEPENDS 看看 函数有没有输出!
#13
因为对c不是太了解,不好意思,多问下!
我没有做过def的输出,也不太懂!
__cdecl的约定模式也要def输出吗?这个模式下好像说函数名不会变的吧!
麻烦知道的可能给点资料,我自己也去找下!
#14
补充一下,我是在visual studio 2008里把.c的文件编译成.dll的!
#15
把文件改成.cpp然后加上extern "C"或者windows那个EXTERNC的宏看看,C语言编出来函数名至少和C++不一样
好像碰到过类似的问题
好像碰到过类似的问题
#16
如果cpp的文件编译的dll相关资料比较多,都是像楼上说的方法,我这里就是要处理c的dll,再次谢楼上各位热心的朋友,现在问题还没有得到解决 再等!
#17
你需要def文件限定dll导出的函数名字
即使是C编译器也会更改输出函数的名字的
即使是C编译器也会更改输出函数的名字的
#18
DEPENDS查看dll的时候,为什么看不到自己写进去的方法呀?好像只有显示一些其它的系统的dll方法的入口函数!
还有好几位朋友说到了def文件的限定函数名,不过这个过程不太熟悉,有好一点的资料吗?网上的资料我看了下,因为对c和c++环境用得很少,所以有些用到的命令和工具我不太了解哪里会有!
还有好几位朋友说到了def文件的限定函数名,不过这个过程不太熟悉,有好一点的资料吗?网上的资料我看了下,因为对c和c++环境用得很少,所以有些用到的命令和工具我不太了解哪里会有!
#19
http://shy-feng.blog007.com/archives/2008/20081013115648.html
在网上找到上面那篇文章,给像我一样的菜鸟分享!
在网上找到上面那篇文章,给像我一样的菜鸟分享!
#20
按上面文章里用dumpbin -exports c:\a.dll
就是我编译的一个dll进行dump出现以下结果,没有看到函数
Dump of file c:\a.dll
File Type: DLL
Summary
1000 .data
1000 .idata
2000 .rdata
1000 .reloc
1000 .rsrc
4000 .text
10000 .textbss
我又试了一个别人写好的c++的dll结果同样看不到方法名
Dump of file c:\c.dll
File Type: DLL
Summary
2000 .reloc
2000 .rsrc
6000 .text
请问下是什么原因
#21
谢谢各位,问题已解决!
编译dll之前加入def文件,声明了导出的dll中方法名Print 就OK了!
a.def里内容
LIBRARY "这个引号里写要导出的dll的名字"
EXPORTS
Print
结贴!!呵呵!
编译dll之前加入def文件,声明了导出的dll中方法名Print 就OK了!
a.def里内容
LIBRARY "这个引号里写要导出的dll的名字"
EXPORTS
结贴!!呵呵!
#22
我也是这个问题,感谢楼主,终于解决了
#23
学习,学习,可是还是没弄明白
#24
#1
c dll和c++dll有本质区别么??
#2
这样调用需要dll在def上输出符号,lz有没有在def上输出?
#3
up
#4
#include <stdio.h>
int Print()
{
int a=3;
return a;
}
static void Main(string[] args)
{
Console.WriteLine("start");
Console.ReadLine();
int s=print();
Console.Write(s);
}
#5
我看过c++的dll里面有一个宏的定义的__declspec(dllexport)或是直接在方法声明的地方加extern “C” __declspec(dllexport) 返回值 方法名()
但我试了下把这句话加在c里面,编译时就报错了!
哪位知道的具体一点好吗?先谢谢了!
我是实在找不到签案了才来问的!
#6
[DllImport("..\\..\\CDll\\Arithmetic.dll", EntryPoint = "Print",CharSet=CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
Auto改为ANSI试一下
#7
汗,颜色怎么没打上?!bug么?我操作有问题?经常这样
#8
你用什么编译器?
#9
文件扩展名为.c
使用def文件不让编译器改函数名字.
使用def文件不让编译器改函数名字.
#10
另外CallingConvention 通常应该为cdecl,你看一下编译选项 确定是stdcall还是cdecl
#11
我看了下自己的.c 编译的dll的调用约定是cdecl的,所以我改了,不过还是不行,还是报入口
按你的改过了,还是报这个!
#12
你用DEPENDS 看看 函数有没有输出!
#13
因为对c不是太了解,不好意思,多问下!
我没有做过def的输出,也不太懂!
__cdecl的约定模式也要def输出吗?这个模式下好像说函数名不会变的吧!
麻烦知道的可能给点资料,我自己也去找下!
#14
补充一下,我是在visual studio 2008里把.c的文件编译成.dll的!
#15
把文件改成.cpp然后加上extern "C"或者windows那个EXTERNC的宏看看,C语言编出来函数名至少和C++不一样
好像碰到过类似的问题
好像碰到过类似的问题
#16
如果cpp的文件编译的dll相关资料比较多,都是像楼上说的方法,我这里就是要处理c的dll,再次谢楼上各位热心的朋友,现在问题还没有得到解决 再等!
#17
你需要def文件限定dll导出的函数名字
即使是C编译器也会更改输出函数的名字的
即使是C编译器也会更改输出函数的名字的
#18
DEPENDS查看dll的时候,为什么看不到自己写进去的方法呀?好像只有显示一些其它的系统的dll方法的入口函数!
还有好几位朋友说到了def文件的限定函数名,不过这个过程不太熟悉,有好一点的资料吗?网上的资料我看了下,因为对c和c++环境用得很少,所以有些用到的命令和工具我不太了解哪里会有!
还有好几位朋友说到了def文件的限定函数名,不过这个过程不太熟悉,有好一点的资料吗?网上的资料我看了下,因为对c和c++环境用得很少,所以有些用到的命令和工具我不太了解哪里会有!
#19
http://shy-feng.blog007.com/archives/2008/20081013115648.html
在网上找到上面那篇文章,给像我一样的菜鸟分享!
在网上找到上面那篇文章,给像我一样的菜鸟分享!
#20
按上面文章里用dumpbin -exports c:\a.dll
就是我编译的一个dll进行dump出现以下结果,没有看到函数
Dump of file c:\a.dll
File Type: DLL
Summary
1000 .data
1000 .idata
2000 .rdata
1000 .reloc
1000 .rsrc
4000 .text
10000 .textbss
我又试了一个别人写好的c++的dll结果同样看不到方法名
Dump of file c:\c.dll
File Type: DLL
Summary
2000 .reloc
2000 .rsrc
6000 .text
请问下是什么原因
#21
谢谢各位,问题已解决!
编译dll之前加入def文件,声明了导出的dll中方法名Print 就OK了!
a.def里内容
LIBRARY "这个引号里写要导出的dll的名字"
EXPORTS
Print
结贴!!呵呵!
编译dll之前加入def文件,声明了导出的dll中方法名Print 就OK了!
a.def里内容
LIBRARY "这个引号里写要导出的dll的名字"
EXPORTS
结贴!!呵呵!
#22
我也是这个问题,感谢楼主,终于解决了
#23
学习,学习,可是还是没弄明白