无法加载文件或程序集“X”或其依赖项之一。指定的模块无法找到

时间:2012-03-06 17:58:34

标签: dll dependencies unmanaged

在黑暗中拍摄,但我想我会尝试发布,希望有一些天才...

背景 我正在尝试将自动化单元测试添加到一个巨大的非托管C ++项目中。由于我们小组中的各种原因,我们希望使用MSTest。因此,需要从托管C#项目调用来自无人管理的MFC C ++项目的类和函数。

可行性证明: 我已经在小范围内完成了这项工作,以证明事实上确实如此。这就是我所做的:

  1. 创建一个包含少量类和函数的非托管MFC C ++项目(SOURCE);编译为静态库(.lib)
  2. 创建一个链接到上述静态库的托管C ++项目(WRAPPER)。每个包装类只是创建一个指向SOURCE中相应类的对象的指针,并调用它的每个函数,就像人们期望包装类一样。编译为动态库(.dll)。
  3. 创建一个C#项目(C_SHARP)。添加对WRAPPER dll的引用。现在您可以直接调用WRAPPER函数(反过来调用非托管SOURCE函数)。
  4. 这很有效。如果你想看到它,我可以分享示例项目。下一步是采用这个概念并开始使用我们庞大,高度耦合的代码库。

    我现在所处的位置 长话短说,我已经成功构建了WRAPPER项目并创建了一个DLL。我添加了对我的C_SHARP项目的引用。我尝试运行它,但它会立即停止并显示消息:

      

    未处理的类型' System.IO.FileNotFoundException'   发生在mscorlib.dll

         

    其他信息:Coule无法加载文件或程序集' WRAPPER.dll'或其中一个依赖项。找不到指定的模块。

    在配置文件模式下运行依赖性walker并获得此信息:

      
        
             

    于2012年6月6日上午10:45:11开始发布个人资料

             

    操作系统:Microsoft Windows XP Professional(32位),版本5.01.2600 Service Pack 3     程序可执行文件: c:\ example \ testing \ bin \ debug \ TESTING.EXE

             

    计划参数:

             

    启动目录: C:\ example \ Testing \ bin \ Debug \

             

    搜索路径: C:\ WINDOWS \ system32; C:\ WINDOWS; C:\ WINDOWS \ System32 \ Wbem

             

    选择的选项:     通过将任何App Paths目录插入PATH环境变量来模拟ShellExecute。

             

    Log DllMain调用进程附加和进程分离消息。

             

    将流程挂钩以收集更详细的依赖关系信息。

             

    记录LoadLibrary函数调用。

             

    记录GetProcAddress函数调用。

             

    记录第一次机会异常。

             

    记录调试输出消息。

             

    记录文件名时使用完整路径。

             

    记录每行日志的时间戳。

             

    自动打开并配置子流程。

             

    00:00:00.000:已启动" c:\ example \ testing \ bin \ debug \ TESTING.EXE" (进程0xF4)地址0x00400000。成功挂钩模块。

             

    00:00:00.047:已加载" c:\ windows \ system32 \ NTDLL.DLL"地址为0x7C900000。成功挂钩模块。

             

    00:00:00.140:已加载" c:\ windows \ system32 \ MSCOREE.DLL"地址0x79000000。成功挂钩模块。     00:00:00.250:已加载" c:\ windows \ system32 \ KERNEL32.DLL"地址0x7C800000。成功挂钩模块。

             

    00:00:00.250:" c:\ windows \ system32 \ NTDLL.DLL"中的DllMain(0x7C900000,DLL_PROCESS_ATTACH,0x00000000);调用。

             

    00:00:00.250:" c:\ windows \ system32 \ NTDLL.DLL"中的DllMain(0x7C900000,DLL_PROCESS_ATTACH,0x00000000);返回1(0x1)。

             

    00:00:00.297:" c:\ windows \ system32 \ KERNEL32.DLL"中的DllMain(0x7C800000,DLL_PROCESS_ATTACH,0x00000000);调用。

             

    00:00:00.312:" c:\ windows \ system32 \ KERNEL32.DLL"中的DllMain(0x7C800000,DLL_PROCESS_ATTACH,0x00000000);返回1(0x1)。

             

    00:00:00.312:Injected" c:\ documents and settings \ administrator \ desktop \ depends22_x86 \ DEPENDS.DLL"在地址     0x08370000。

             

    00:00:00.344:" c:\ windows \ system32 \ MSCOREE.DLL"中的DllMain(0x79000000,DLL_PROCESS_ATTACH,0x00000000);调用。

             

    00:00:00.344:" c:\ documents中的DllMain(0x08370000,DLL_PROCESS_ATTACH,0x00000000)     设置\管理员\桌面\ depends22_x86 \ DEPENDS.DLL"调用。

             

    00:00:00.344:" c:\ documents中的DllMain(0x08370000,DLL_PROCESS_ATTACH,0x00000000)     设置\管理员\桌面\ depends22_x86 \ DEPENDS.DLL"返回1     (为0x1)。

             

    00:00:00.344:GetProcAddress(0x7C800000 [c:\ windows \ system32 \ KERNEL32.DLL]," FlsAlloc")来自     " C:\ Windows \ System32下\ MSCOREE.DLL"在地址0x79006F3C并返回     0xFFBADD11。

             

    00:00:00.359:退出" c:\ example \ testing \ bin \ debug \ TESTING.EXE" (进程0xF4),代码为-1073740791(0xC0000409)。

      

    问题: 怎么了?为什么这在我的小可行性示例中有效,但与我想要的实际代码无关?我正在将WRAPPER项目链接到其他几个库,但为什么会这么重要?

0 个答案:

没有答案