2011-08-29 117 views
1

我有一个托管的dll文件,它将C++ dll的函数导入托管环境。我在我的程序中使用了它的一些功能,但问题是,当我使用它时出现此错误:C#导入C++的dll

无法加载DLL'Libraries \ lib.dll':无法找到指定的模块。 (来自HRESULT的异常:0x8007007E)

我将.dll文件放在程序的目录和system32文件夹中。但是,它仍然不起作用。我想我必须使用DLLImport,但我不知道如何使用它..即使看了一些例子,我仍然感到困惑。有人可以帮我吗?

+0

请详细说明。 –

+0

介意告诉我你需要什么细节? – david

+0

DLL的名称。他们在哪里。 DLLImport语句。 –

回答

1

你说:

我把.dll文件在程序的目录...

但是:

无法加载DLL “库\ lib中。 dll'

我们需要看到您的DLLImport属性创建,即本机方法的C#签名。它看起来像你对我可能指定路径,即

[DLLImport("Libraries\lib.dll")]; 
static extern void MyNativeMethod(); 

尝试使用这个:

[DLLImport("lib.dll")]; 
static extern void MyNativeMethod(); 

,将搜索的运行目录以及通过您的PATH环境变量。如果你指定一个文件路径,我真的不知道它是否会通过PATH搜索,如果没有找到该文件(我找不到在the docs中提到它)。

2

没有足够的信息在这里帮助,因为你没有显示的API(本机代码)你想导入等

话虽这么说,我强烈推荐阅读MSDN上的Platform Invoke Tutorial以及A Closer Look at Platform Invoke。他们介绍了主要问题,并展示了很多关于如何从C++ DLL导入和使用函数的例子。

0

如果您确定导出(使用dependancy walker进行检查)并且您已使用正确的PInvoke调用正确映射它们,那么您的问题可能与32/64位相关,尤其是如果您在64位操作系统上.NET应用程序设置为任何CPU。

使用PInvoke时,32位本机DLL只能由32位.NET进程加载(这同样适用于64位本机DLL)。

您可以使用Properties-> Build-> Platform target更改平台目标,也可以使用CorFlags实用程序。

0
The best and easiest way of using a c++ dll file in c# :- 


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 

namespace demo1 
{ 
    class Program 
    { 
     [DllImport("shi.dll", EntryPoint = "[email protected]@YAXXZ")] 
     public static extern int HelloWorld(); 
     public static void Main(string[] args) 
     { 
      //Console.WriteLine(StringUtilities.HelloWorld()); 
      Console.WriteLine(HelloWorld()); 
      // public static extern void HelloWorld(); 
      // HelloWorld(); 
      // Console.ReadKey(); 
     } 
    } 
}