无法在DLL中查找过程

为什么不能在dll中find指定的程序?

我有一个为Windows x86编译的my.dll库(操作系统是Windows 7 x64;但是我使用的是Go x86二进制文件 – LiteIDE – 而C#代码也是针对x86体系结构进行了显式编译的)。 我从C#使用它,它的工作原理:

 [DllImport("my.dll", EntryPoint = "my_function")] public static extern double my_function(double x); 

但是,当我尝试使用它(在这里我试图find它)​​从通过:

 var ( dllMine = syscall.NewLazyDLL("my.dll") my_function = dllMine.NewProc("my_function") ) func main() { err := my_function.Find() if err != nil { fmt.Println(err) return } //... } 

它说Failed to find my_function procedure in my.dll: The specified procedure could not be found.Failed to find my_function procedure in my.dll: The specified procedure could not be found.my.dll文件驻留在与生成的.exe文件相同的目录中。 入口点名称( "my_function" )确实存在,因为它在C#中导入时工作正常,并且没有说Failed to load my.dll: The specified module could not be found.

实际部分:我试图调用的库是swedll32.dll ,它是瑞士Ephemeris的核心库(可以在这里下载 – GNU),只是为了testing这个场景,被调用的函数是swe_julday ; 用这个签名来重现错误:

 double swe_julday( int year, int month, int day, double hour, int gregflag); /* Gregorian calendar: 1, Julian calendar: 0 */ 

另一件事是我的GOROOT环境参数实际上是一个NTFS交接点(所以我可以在x86和x64版本之间切换) – 但我不认为这是相关的,因为输出.exe应用程序正在生成没有任何问题(只是为了承认我所有的罪过!)。

Solutions Collecting From Web of "无法在DLL中查找过程"

我已经从http://www.astro.com/ftp/swisseph/sweph.zip下载了你的DLL,看看是否有swe_julday函数:

 C:\foo>dumpbin /exports swedll32.dll | find "swe_julday" 74 49 0000C440 _swe_julday@24 75 4A 0000D4A0 _swe_julday_d@24 

在那里我没有看到swe_julday函数。 相反,我看到_swe_julday @ 24功能。 所以,如果我改变你的程序:

 C:\foo>type foo.go package main import ( "syscall" "fmt" ) var ( dllMine = syscall.NewLazyDLL("swedll32.dll") my_function = dllMine.NewProc("_swe_julday@24") ) func main() { err := my_function.Find() if err != nil { fmt.Println(err) return } //... } 

它运行没有任何错误:

 C:\foo>go run foo.go C:\foo>