提问人:Rau18 提问时间:9/19/2023 最后编辑:SamRau18 更新时间:9/20/2023 访问量:157
如何解决“在[dll]中找不到DLL入口点[函数]”?
How to solve "Can't find DLL entry point [function] in [dll]"?
问:
我正在使用 .NET Framework 4.7.2 制作的 x64 类库。
此代码将在 MS Access 和 Office365 中使用,我需要将库加载到数据库中。
下面是我用来引用 dll 的代码,重要的是要知道这个代码片段位于类模块中:
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As LongPtr) As Long
Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal GetModuleHandle As String) As LongPtr
Private Declare PtrSafe Function myFunction Lib "Path\To\dll.dll" () As Object
当然,类模块有一个函数,它声明了一个对象,以便能够调用类内的所有其他函数,代码如下:
Private Function DM() As Object
On Error Resume Next
If dmObject Is Nothing Then
'load from the dll
hLibModuleID = LoadLibrary("Path\to\dll.dll")
'Debug.Print hLibModuleID
Set dmObject = myFunction()
'Debug.Print dmObject
End If
Set DM = dmObject
End Function
我的问题出现在行中,因为返回并抛出以下错误:Set dmObject = myFunction()
myFunction()
Nothing
我正在使用 MS Access x64,所以显然 dll 是在相应的平台目标中编译的。
我还安装了调用,它允许我添加以下引用:NuGet Package
UnmanagedExports
using RGiescke.DllExport;
及其属性:
[DllExport]
如果可以提供帮助,我的项目将使用旧文件而不是旧文件。Visual Studio
PackageReference
Packages.config
有谁知道如何解决这个问题?
谢谢。
答:
-1赞
Rau18
9/20/2023
#1
在花了几个小时后,我找到了解决方案。
问题出在我返回对象的方式上,所以,这不是代码的问题,而是来自.MyFunction()
VBA
C#
我正在做以下事情:
MyClass object = new MyClass();
return object;
问题是当我声明变量时,我不能直接将其设置为 ,我这样做了:object
MyClass
var object = new MyClass();
如果我声明变量,因为它工作得很完美。var
这是一个很容易解决的问题,但我花了很多时间在上面。
至少我学到了一些新东西;)
评论
0赞
GSerg
9/20/2023
MyClass object = new MyClass();
并且它们创建的变量类型相同。两者都不会导致您引用的 VBA 中的错误 453。显然,您所做的只是重新编译库,因为您使用的是VBA中没有该功能的旧版本。var object = new MyClass();
object
0赞
Rau18
9/20/2023
我不仅重新编译(当然我做了,但不仅如此)。这不是真的,至少对我的问题来说是这样。我发现解决这个问题的唯一方法就是改变我说的话。
0赞
GSerg
9/20/2023
的含义不会因问题而异。代码中的更改完全没有起到任何作用。显然,重新编译做到了。明确为假的声明,因为已将变量声明为 ,您绝对可以为其赋值。var
when I am declaring the variable object, I cannot set it directly to MyClass
MyClass
new MyClass()
0赞
Rau18
9/20/2023
就我而言,这又是解决方案,这不是我尝试的第一件事,改变它,我可以做到。这不仅仅是为了重新编译。我不是想让你理解它,因为你没有问题,但这是我的解决方案,它对我有用。还有什么要说的。
1赞
GSerg
9/20/2023
这不是您案例的解决方案。声称它只会让未来的读者感到困惑。以同样的理由,您可以说问题在于您的代码中有一个注释,并且在您将该注释更改为 后,您的代码已修复。修复它的不是评论中的更改。你到底做了什么修复了它,我们不知道,我唯一的猜测是这是重新编译。我们所知道的是,它没有更改为 .// Creating an object here
// Creating a var here
MyClass object
var object
下一个:如何在VBA中正确使用全局对象?
评论
LoadLibrary
UnmanagedExports