无法加载DLL

时间:2011-12-04 10:05:02

标签: c# dll path dllimport

我正在尝试使用DllImport加载一个dll,如果我指定了dll的路径,它工作正常,但是,如果我没有指定dll的路径,只需键入“foo.dll”,它会抱怨“无法加载dll“即使你已经将dll文件放入bin文件夹。

我想如果我没有指定dll路径,它会假设它会在与exe文件相同的文件夹中启动dll,但看起来情况并非如此。

有什么建议吗?

谢谢

3 个答案:

答案 0 :(得分:0)

在您的C ++ DLL项目中打开项目属性,导航到C / C ++ - >代码生成。然后为运行时库设置调试配置的多线程调试(/ MTd)和发布的多线程(/ MT)。之后,您可以将已编译的dll放在输出目录中,并检查是否有效。随意发表评论并提出问题。

<强> UPD:

这是link to the simple little project,它使用本机代码测量当前CPU频率,DllImport与C#项目代码进行比较。

构建步骤: 1.在任何配置中构建C ++项目(实际上,在此示例中使用的配置并不重要)。 2.在配置输出文件夹中找到已编译的dll(Debug | Release) 3.将找到的dll添加到C#项目的ExternalLibraries文件夹中,将操作设置为文件属性中的Copy If Newest(右键单击lib - &gt;属性)。 4.构建并运行C#项目 - &gt;利润。

为什么我向你建议:我的客户端要求一个测量CPU频率的代码,我已经在我的机器上运行了这个代码,但客户端却没有。它依赖于MS VC运行时库。为调试配置设置多线程调试(/ MTd)后,所有依赖项的发布代码的多线程(/ MT)都嵌入到二进制文件中,因此至少有一个依赖项源可以解析。

答案 1 :(得分:0)

如果您不想使用路径,则可以始终将dll放在Windows GAC(wiki link)中。这可能是一件痛苦的事情,因为有时您需要签署您的dll,但是可以在没有路径的情况下访问其中的内容。

答案 2 :(得分:0)

您尝试加载的DLL很可能取决于其他资源。您可以通过首先在远程路径上调用Win32的DllImport来欺骗LoadLibraryDllImport会注意到该库已经被加载到内存中,它应该可以正常工作。

代码段:

    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("yourlibrary.dll")]
    public static extern void Foo();

    public void CallTheFooMethod()
    {
       // first load the library
       LoadLibrary( "C:/..........full path/yourlibrary.dll" );

       Foo();  
    }