C# LoadLibrary()在C中返回0#

C# LoadLibrary()在C中返回0#,c#,visual-studio,dll,dllimport,loadlibrary,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中查看任何特定的过程。我只想加载DL

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


你知道哪里不对吗?

这是我在上面发布的问题的答案。我的加载项使用了一个名为“pcl\u features\u release.DLL”的依赖DLL。Revit在我的外接程序之前加载了另一个外接程序,该外接程序也加载了它自己的“pcl\u features\u release.dll”,这可能与我的稍有不同。因此,尽管Revit正在查找我的DLL,但无法加载它


另一个问题:在本例中,两个加载项依赖于“pcl_features_release.dll”,这是点云库()提供的dll。在这种情况下避免冲突的最佳做法是什么。我无法更改其他人的加载项。如何确保我的外接程序加载随外接程序提供的“pcl\u功能\u release.dll”?

pinvoke呢?我对C和.Net不熟悉。我猜PInvoke使用DllImport,对吗?在任何情况下,在使用LoadLibrary()之前,我都是直接使用DllImport。换句话说,我有:`[DllImport(“Index.dll”)]私有静态外部IntPtr createIndex(浮点间距,IntPtr错误代码)`调用
createIndex()
后,我得到一个错误,即找不到
Index.dll
。即使我正在调用
setdldirectory(“E:\\Rep3DLib\\builds\\Release”)createIndex()
之前的代码>。我切换到
LoadLibrary()
,因为我认为这样会更容易调试。你机器上的dll会损坏吗?山姆,如果是这样的话,第二个项目中的代码应该也不会工作,对吧?但是第二个项目中的代码工作得很好。插件项目中是否会输入错误的LoadLibrary路径?或者可能路径包含文件系统中的拼写错误(例如,目录拼写错误)?是否为DLL副本提供唯一名称作为选项?我可以试一试。DLL是使用CMake项目生成的,因此我需要弄清楚如何将版本号或某些唯一字符串附加到库文件名。