簡體   English   中英

在托管DLL中加載C ++ DLL時出現EEFileLoadException

[英]EEFileLoadException When Loading C++ DLL in Managed DLL

我有一個非托管的C ++ DLL,我想從C#exe中調用它。 我查看了可能的解決方案,在我看來,最好的辦法是使用C ++ / CLI作為非托管C ++類的包裝器。 所以我寫了一個看起來像這樣的C ++ / CLI類,並編譯成一個DLL(我知道它應該有一個析構函數和一個終結器,但到目前為止,代碼不會進入Main函數,所以我將它們排除在外簡單的緣故):

#include <cppheader.h>

using namespace System;

namespace DependencyInterface
{
  public ref class DependencyTester
  {
  public:
    DependencyTester()
    {
      _class = new CPPClass();
    }

  private:
    CPPClass* _class;
  };
}

然后我有一個C#可執行文件,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DependencyInterface;

namespace DependencyTest2
{
    class Program
    {
        static void Main(string[] args)
        {
            DependencyTester tester;
        }
    }
}

不幸的是,當我嘗試運行代碼時,我得到以下C ++異常:

First-chance exception at 0x000007fefd5a9e5d in DependencyTest2.exe: Microsoft C++ exception: EEFileLoadException * __ptr64 at memory location 0x0094ca58..

我試圖在Main的第一行設置斷點,但在執行到達該點之前拋出異常。 如果我點擊“繼續”(我正在使用MVS 2010),我會得到:

First-chance exception at 0x76d8c5e2 in DependencyTest2.exe: 0xC0000005: Access violation reading location 0x0000000000000020.

有人有建議嗎? 這是在Windows 7 x64上,並且已經為x64編譯了所有內容,包括C ++ DLL。

EEFileLoadException指示可執行文件無法找到或加載其中一個依賴項。 這當然可以有不同的原因(路徑問題,混合配置,混合平台)。

一個好的開始是在你的DLL /可執行文件上使用Dependency Walker(確保使用x64版本)。

我有一個類似的問題,我在C#項目中引用了一個dll,引用的dll本身依賴於我在解決方案中沒有包含的其他一些dll。 在我的解決方案中添加對缺少的dll的引用之后,問題得以解決。 或者,您可以將缺少的dll直接復制到應用程序目錄。 使用Dependency Walker沒有幫助,因為他們沒有顯示丟失的dll的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM