我在C#中创建一个Autodesk Revit加载项。此项目的输出是DLL本身。在这个项目中,我通过调用:
加载另一个非托管DLL IntPtr pDll = LoadLibrary("E:\\Rep3DLib\\builds\\Release\\Index.dll");
int a = Marshal.GetLastWin32Error();
在调试器中,我看到pDll
的值为0,a
的值为127(错误:找不到指定的过程。)。这是令人惊讶的,因为我甚至没有在DLL中查找任何特定的过程。我只是想加载DLL。
现在我从E:\\Rep3DLib\\builds\\Release\\Index.dll
删除了非托管DLL,在上面的代码中,a
的值为126(错误:找不到指定的模块。)。这确实有意义。这也意味着当DLL出现在正确的位置时,代码能够找到它但不知何故它正在寻找一个它无法找到的过程。
要调试此问题,我在同一解决方案中创建了另一个项目。这是该项目的代码:
namespace testIndex {
class Program {
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllToLoad);
static void Main(string[] args) {
IntPtr pDll = LoadLibrary("E:\\Rep3DLib\\builds\\Release\\Index.dll");
int a = Marshal.GetLastWin32Error();
}
}
}
当我运行它时,pDll
具有非零值,我可以调用Index.dll
中定义的函数。
请注意,两个项目都将目标平台设为x64。我还验证了如果我构建Revit加载项并在另一台机器上运行它,它确实找到了DLL。所以不管怎么说,虽然路径E:\\Rep3DLib\\builds\\Release\\Index.dll
肯定是正确的,但它不能仅在我的机器上找到DLL。
知道可能出现什么问题吗?
答案 0 :(得分:0)
以上是我在上面发布的问题的答案。我的加载项使用名为" pcl_features_release.dll"的依赖DLL。 Revit在我之前加载了另一个加载项,它还加载了自己的" pcl_features_release.dll"这可能与我的略有不同。因此,尽管Revit找到了我的DLL,但它无法加载它。
另一个问题:在这种情况下,两个加载项依赖于" pcl_features_release.dll&#34 ;,这是Point Cloud Library(http://pointclouds.org/)提供的DLL。在这种情况下避免冲突的最佳做法是什么。我不能改变其他人的加载项。如何确保我的加载项加载我的" pcl_features_release.dll"正在使用加载项提供?