c#调用c dll无法找到入口点的问题(非c++ dll)

时间:2021-11-05 19:14:01
  自己写了一个简单的c文件,并编译成dll用于c#的项目中
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


引用 2 楼 keven1868 的回复:
这样调用需要dll在def上输出符号,lz有没有在def上输出?


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


引用 2 楼 keven1868 的回复:
这样调用需要dll在def上输出符号,lz有没有在def上输出?

我看过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


引用 5 楼 lovko1985 的回复:
引用 2 楼 keven1868 的回复:

这样调用需要dll在def上输出符号,lz有没有在def上输出? 

我看过c++的dll里面有一个宏的定义的__declspec(dllexport)或是直接在方法声明的地方加extern “C” __declspec(dllexport) 返回值 方法名() 
但我试了下把这句话加在c里面,编译时就报错了! 
哪位知道的具体一点好吗?先谢谢了! 
我是实在找不到签案了才来问的!


你用什么编译器? 

#9


文件扩展名为.c

使用def文件不让编译器改函数名字.

#10


另外CallingConvention 通常应该为cdecl,你看一下编译选项 确定是stdcall还是cdecl

#11


引用 10 楼 akirya 的回复:
另外CallingConvention 通常应该为cdecl,你看一下编译选项 确定是stdcall还是cdecl

我看了下自己的.c 编译的dll的调用约定是cdecl的,所以我改了,不过还是不行,还是报入口
引用 6 楼 akirya 的回复:
Auto改为ANSI试一下

按你的改过了,还是报这个!

#12


你用DEPENDS 看看 函数有没有输出!

#13


引用 2 楼 keven1868 的回复:
这样调用需要dll在def上输出符号,lz有没有在def上输出?

因为对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编译器也会更改输出函数的名字的 

#18


DEPENDS查看dll的时候,为什么看不到自己写进去的方法呀?好像只有显示一些其它的系统的dll方法的入口函数!
还有好几位朋友说到了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
结贴!!呵呵!

#22


我也是这个问题,感谢楼主,终于解决了

#23


学习,学习,可是还是没弄明白

#24


c#调用c dll无法找到入口点的问题(非c++ dll)

#1


c dll和c++dll有本质区别么??

#2


这样调用需要dll在def上输出符号,lz有没有在def上输出?

#3


引用 2 楼 keven1868 的回复:
这样调用需要dll在def上输出符号,lz有没有在def上输出?


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


引用 2 楼 keven1868 的回复:
这样调用需要dll在def上输出符号,lz有没有在def上输出?

我看过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


引用 5 楼 lovko1985 的回复:
引用 2 楼 keven1868 的回复:

这样调用需要dll在def上输出符号,lz有没有在def上输出? 

我看过c++的dll里面有一个宏的定义的__declspec(dllexport)或是直接在方法声明的地方加extern “C” __declspec(dllexport) 返回值 方法名() 
但我试了下把这句话加在c里面,编译时就报错了! 
哪位知道的具体一点好吗?先谢谢了! 
我是实在找不到签案了才来问的!


你用什么编译器? 

#9


文件扩展名为.c

使用def文件不让编译器改函数名字.

#10


另外CallingConvention 通常应该为cdecl,你看一下编译选项 确定是stdcall还是cdecl

#11


引用 10 楼 akirya 的回复:
另外CallingConvention 通常应该为cdecl,你看一下编译选项 确定是stdcall还是cdecl

我看了下自己的.c 编译的dll的调用约定是cdecl的,所以我改了,不过还是不行,还是报入口
引用 6 楼 akirya 的回复:
Auto改为ANSI试一下

按你的改过了,还是报这个!

#12


你用DEPENDS 看看 函数有没有输出!

#13


引用 2 楼 keven1868 的回复:
这样调用需要dll在def上输出符号,lz有没有在def上输出?

因为对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编译器也会更改输出函数的名字的 

#18


DEPENDS查看dll的时候,为什么看不到自己写进去的方法呀?好像只有显示一些其它的系统的dll方法的入口函数!
还有好几位朋友说到了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
结贴!!呵呵!

#22


我也是这个问题,感谢楼主,终于解决了

#23


学习,学习,可是还是没弄明白

#24


c#调用c dll无法找到入口点的问题(非c++ dll)