为什么这个显式链接的DLL委托在一个程序中成功而在另一个程序中不成功?

时间:2017-11-17 12:31:30

标签: vb.net dll

我有2个共享项目的程序,其中API DLL用于对另一个目录中的文件执行操作。我遇到的问题是这个代码在一个项目中工作,但在另一个项目中它失败了:

moduleHandle = LoadLibrary(“api.dll”)

早些时候,失败的程序无法连接到API DLL,因此在比较了两者的Process Monitor日志之后,我将一些DLL复制到了与它相同的目录中。然后它成功了,而且两个程序中的moduleHandle的值现在都相同。下一个:

methodPointer = GetProcAddress(moduleHandle, "NameOfSomeFunction")
delegateForSomeFunction = Marshal.GetDelegateForFunctionPointer(methodPointer, GetType(SomeFunctionType))

当我们到达delegateForSomeFunction时,我可以看到_methodPtr的值在一个程序与另一个程序之间是不同的。然后当我们调用委托时:

Dim argsArray() As Object = New Object() {directoryPath, errorFilePath}        
Dim retVal As Short = delegateForSomeFunction.DynamicInvoke(argsArray)

在一个程序中,这只是默默地失败。关于如何继续,我有点不知所措。我该怎么做才能进一步调查这个问题,如何让它发挥作用?

我在Visual Studio 2013中的调试中运行它,该项目在.NET 4中。

1 个答案:

答案 0 :(得分:0)

虽然将winsxs中正确版本的依赖项复制到API DLL的同一目录中,但是我可以在没有明显错误的情况下执行LoadLibrary,但它在后台导致了更多错误。

问题最终出现在清单中。有一个post-build事件,它从.exe中删除了清单,为部署步骤做准备,允许您指定存在的API的不同版本。创建一个正确的appname.exe.manifest文件,指定我无法正常加载的依赖程序集,然后将其放在与.exe相同的目录中,解决了这个问题。