用DllImport调用c#写的dll,出现错误
写了个调用dll的测试,几乎什么都没做 。但提示“无法在 DLL“IpConnDll.dll”中找到名为“Pinging”的入口点。”
程序如下:
dll中的代码:
namespace IpConnDll
{
public class Class1
{
public bool Pinging(string aa)
{
MessageBox.Show(aa);
return true;
}
}
}
引用程序中的代码:
namespace ping
{
public partial class Form1 : Form
{
public transfer Dog;
public Form1()
{
InitializeComponent();
Dog = new transfer();
}
private void button1_Click(object sender, EventArgs e)
{
Dog.Ping2(textBox1.Text.Trim(), 255, 65535);
}
}
[StructLayout(LayoutKind.Sequential)]
public unsafe class transfer
{
[DllImport("IpConnDll.dll", CharSet = CharSet.Ansi)]
static unsafe extern bool Pinging(string addr, int id, uint taskid);
public unsafe bool Ping2(string addr, int id, uint taskid)
{
return Pinging(addr, id, taskid);//此出出错:“无法在 DLL“IpConnDll.dll”中找到名为“Pinging”的入口点。”
}
}
}
------解决方案--------------------打开vs.net命令行 用dumbpin命令 查看你的IpConnDll.dll
用法:dumbpin /exports DLLNAME
看看Pinging的入口点是什么 复制过来 DllImport( "IpConnDll.dll ", EnterPoint="****"CharSet = CharSet.Ansi)]
------解决方案--------------------汗...
C#写出来的dll本身就是托管的DLL,怎么导出一个函数嘛...
在新的工程里添加一个对这个dll的引用就可以使用里面的类了(前提是public)
Dllimport是为了使用非托管dll用的.
------解决方案--------------------非托管的用[DllImport( "IpConnDll.dll ", CharSet = CharSet.Ansi)]
要是托管的就不用了,直接引进来,引用下,就能用了
------解决方案--------------------因为编译器在编译的过程中,会将函数名改名.
比如你写的Pinging(),其实在DLL里面,你的函数名很可能是_Pingping@0之类,这时你查找Pingping是找不到的,具体名字你可以用dumpbin看一下.
在C++中,我们可以加extern "C" 来限制编译器不改名,能够顺利被其他程序项调用.
在C#中,你可以直接用反射来进行调用,也不会有名字问题.