C#运行的时候提示“无法加载DLL(XXXX.dll)”,DllImport设置绝对路径后就不报错了。

时间:2022-08-31 09:15:02
做的是公司的程序。现在有个第三方提供了一个Dll给我来调用。我写的一个Demo去调用,完全OK没有任何问题。但是把这个调用方法加到公司的程序里面,那么问题就来了……报错说无法加载DLL。

在网上找了下,使用DllImport加上DLL的绝对路径,尝试了下,可行。但是设置绝对路径麻烦很大,很不方便使用……如程序如果更换了位置,或者是以后别人来部署这个程序,不知道这点的话,又会折腾很久。有没有别的办法可以解决这个问题,为什么一定要加上绝对路径呢?

14 个解决方案

#1


DllImport里不要设置路径,直接加载***.dll,这个dll保持跟你程序的exe在同一个目录就可以了

#2


说明你的dll没有放到exe同目录下来

#3


刚刚发现,把项目从AnyCPU改成x86之后,就不报错了……蛋疼。

#4


引用 2 楼 bdmh 的回复:
说明你的dll没有放到exe同目录下来

放在同一个目录了,刚刚发现问题的真正原因了,因为我之前项目都是用AnyCPU的,改成了x86就可以正常使用哪个DLL了。

#5


我每次都是AnyCPU,没问题啊

#6


吧DLL添加到项目然后属性,每次都重新生成

#7


引用 4 楼 hxy91819 的回复:
Quote: 引用 2 楼 bdmh 的回复:

说明你的dll没有放到exe同目录下来

放在同一个目录了,刚刚发现问题的真正原因了,因为我之前项目都是用AnyCPU的,改成了x86就可以正常使用哪个DLL了。

开发64位时,选择anycpu,import调用dll没有类似问题
应该不是这里的原因吧
不过问题解决了就行

#8


一般是dll和exe没在一个目录引起这种问题

#9


Any CPU会让程序在32位系统下以32位运行,64位系统下以64位运行(如果选了Prefer 32-bit则会在32位下运行)。
x86在32位和64位系统下都以32位运行。x64在32位系统不能运行,在64位系统以64位运行。
32位进程只能加载32位dll,64位进程只能加载64位dll。

所以如果要DllImport非系统的dll,就不要用Any CPU,除非自己手动写代码选择加载dll的正确版本,否则会有问题的。

windows自带的dll没问题是因为它64位的版本在C:\Windows\system32下,32位的版本在C:\Windows\SysWOW64下,系统会自动选择合适的dll。

#10


引用 9 楼 github_22161131 的回复:
Any CPU会让程序在32位系统下以32位运行,64位系统下以64位运行(如果选了Prefer 32-bit则会在32位下运行)。
x86在32位和64位系统下都以32位运行。x64在32位系统不能运行,在64位系统以64位运行。
32位进程只能加载32位dll,64位进程只能加载64位dll。

所以如果要DllImport非系统的dll,就不要用Any CPU,除非自己手动写代码选择加载dll的正确版本,否则会有问题的。

windows自带的dll没问题是因为它64位的版本在C:\Windows\system32下,32位的版本在C:\Windows\SysWOW64下,系统会自动选择合适的dll。

好。 C#运行的时候提示“无法加载DLL(XXXX.dll)”,DllImport设置绝对路径后就不报错了。

#11


引用 9 楼 github_22161131 的回复:
Any CPU会让程序在32位系统下以32位运行,64位系统下以64位运行(如果选了Prefer 32-bit则会在32位下运行)。
x86在32位和64位系统下都以32位运行。x64在32位系统不能运行,在64位系统以64位运行。
32位进程只能加载32位dll,64位进程只能加载64位dll。

所以如果要DllImport非系统的dll,就不要用Any CPU,除非自己手动写代码选择加载dll的正确版本,否则会有问题的。

windows自带的dll没问题是因为它64位的版本在C:\Windows\system32下,32位的版本在C:\Windows\SysWOW64下,系统会自动选择合适的dll。

总结全面

#12


使用第三方dll之前,先了解一下对方的dll是否只能在x86下才能正常引用。

#13


把第三方DLL文件放到你的程序的根目录==>bin文件夹==>Debug文件夹 下,然后程序调用的地方就不用写绝对路径或相对路径,只要写文件名+后缀名 就可以。 如 xxxx.dll

#14


Dll放在bin\debug目录下

#1


DllImport里不要设置路径,直接加载***.dll,这个dll保持跟你程序的exe在同一个目录就可以了

#2


说明你的dll没有放到exe同目录下来

#3


刚刚发现,把项目从AnyCPU改成x86之后,就不报错了……蛋疼。

#4


引用 2 楼 bdmh 的回复:
说明你的dll没有放到exe同目录下来

放在同一个目录了,刚刚发现问题的真正原因了,因为我之前项目都是用AnyCPU的,改成了x86就可以正常使用哪个DLL了。

#5


我每次都是AnyCPU,没问题啊

#6


吧DLL添加到项目然后属性,每次都重新生成

#7


引用 4 楼 hxy91819 的回复:
Quote: 引用 2 楼 bdmh 的回复:

说明你的dll没有放到exe同目录下来

放在同一个目录了,刚刚发现问题的真正原因了,因为我之前项目都是用AnyCPU的,改成了x86就可以正常使用哪个DLL了。

开发64位时,选择anycpu,import调用dll没有类似问题
应该不是这里的原因吧
不过问题解决了就行

#8


一般是dll和exe没在一个目录引起这种问题

#9


Any CPU会让程序在32位系统下以32位运行,64位系统下以64位运行(如果选了Prefer 32-bit则会在32位下运行)。
x86在32位和64位系统下都以32位运行。x64在32位系统不能运行,在64位系统以64位运行。
32位进程只能加载32位dll,64位进程只能加载64位dll。

所以如果要DllImport非系统的dll,就不要用Any CPU,除非自己手动写代码选择加载dll的正确版本,否则会有问题的。

windows自带的dll没问题是因为它64位的版本在C:\Windows\system32下,32位的版本在C:\Windows\SysWOW64下,系统会自动选择合适的dll。

#10


引用 9 楼 github_22161131 的回复:
Any CPU会让程序在32位系统下以32位运行,64位系统下以64位运行(如果选了Prefer 32-bit则会在32位下运行)。
x86在32位和64位系统下都以32位运行。x64在32位系统不能运行,在64位系统以64位运行。
32位进程只能加载32位dll,64位进程只能加载64位dll。

所以如果要DllImport非系统的dll,就不要用Any CPU,除非自己手动写代码选择加载dll的正确版本,否则会有问题的。

windows自带的dll没问题是因为它64位的版本在C:\Windows\system32下,32位的版本在C:\Windows\SysWOW64下,系统会自动选择合适的dll。

好。 C#运行的时候提示“无法加载DLL(XXXX.dll)”,DllImport设置绝对路径后就不报错了。

#11


引用 9 楼 github_22161131 的回复:
Any CPU会让程序在32位系统下以32位运行,64位系统下以64位运行(如果选了Prefer 32-bit则会在32位下运行)。
x86在32位和64位系统下都以32位运行。x64在32位系统不能运行,在64位系统以64位运行。
32位进程只能加载32位dll,64位进程只能加载64位dll。

所以如果要DllImport非系统的dll,就不要用Any CPU,除非自己手动写代码选择加载dll的正确版本,否则会有问题的。

windows自带的dll没问题是因为它64位的版本在C:\Windows\system32下,32位的版本在C:\Windows\SysWOW64下,系统会自动选择合适的dll。

总结全面

#12


使用第三方dll之前,先了解一下对方的dll是否只能在x86下才能正常引用。

#13


把第三方DLL文件放到你的程序的根目录==>bin文件夹==>Debug文件夹 下,然后程序调用的地方就不用写绝对路径或相对路径,只要写文件名+后缀名 就可以。 如 xxxx.dll

#14


Dll放在bin\debug目录下