日期:2014-05-18  浏览次数:21122 次

用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#中,你可以直接用反射来进行调用,也不会有名字问题.