LoadLibrary()在C#

时间:2018-01-23 02:12:25

标签: c# visual-studio dll dllimport loadlibrary

我在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。

知道可能出现什么问题吗?

1 个答案:

答案 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"正在使用加载项提供?