Assembly.LoadFrom 在带有 MFC 的 cpp/CLI DLL 上失败,包括

Posted

技术标签:

【中文标题】Assembly.LoadFrom 在带有 MFC 的 cpp/CLI DLL 上失败,包括【英文标题】:Assembly.LoadFrom fails on a cpp/CLI DLL with MFC includes 【发布时间】:2013-06-13 17:07:28 【问题描述】:

我有一个 C# 应用程序,它使用 Assembly.LoadFrom 动态加载其他 dll。 如果 dll 是受 MFC 支持的托管 cpp 并且任何包含此类 afxwin.h,则此方法将失败。

要重现此行为,您只需使用向导创建一个新的托管 cpp dll。将 MFC 支持标志添加到配置中。除非您没有将任何 MFC 标准包含在 stdafx.h 文件中,否则 Assembly.LoadFrom 不会失败。如果将#include "afxwin.h" 放入stdafx.h 文件中,Assembly.LoadFrom 将失败! (即 dll 为空!)

有什么线索???

谢谢, 出租车

【问题讨论】:

+1 表示不使用程序集标签。 :) 对于依赖于非托管 DLL 的混合模式程序集,LoadFrom() 很可能会失败。 Windows 没有太多机会找到这样的 DLL,因为它不太可能存储在与 EXE 相同的目录中或 PATH 上。 DLL 听起来不太可能。 程序集都在同一个目录中。没有 #include "afxwin.h" 的空 dll 加载良好,添加包含,没有其他内容让加载失败。 @Devolus: mov ebx,声望;公司 ebx; :) 【参考方案1】:

我尝试按照您在 Visual Studio 2010 中描述的方式进行操作。

我将项目设置设置为使用 MFC 作为共享 DLL,并将 afxwin.h 包含在 stdafx.h 中。 我成功调用了 AfxMessageBox()。所以这不可能是你使用 MFC 的事实,它必须是别的东西。

我想您将 MFC 用作共享 DLL?另外,请写下您的完整异常详细信息。 使用进程监视器 (http://technet.microsoft.com/en-us/sysinternals/bb896645) 检查您的应用尝试加载哪些 DLL。也许这将揭示可能丢失的 DLL(如 MFC 运行时)。使用 Dependency Walker (depends.exe) 查看混合模式库引用的 DLL。

另外,如果你碰巧使用了静态链接的 boost::thread,这将导致混合模式程序集的加载失败。

【讨论】:

以上是关于Assembly.LoadFrom 在带有 MFC 的 cpp/CLI DLL 上失败,包括的主要内容,如果未能解决你的问题,请参考以下文章

释放 Assembly.LoadFrom 文件句柄

如果在 Windows 服务 .net 可执行文件中调用 .NET Assembly.Load/LoadFrom 会失败

ASP.NET:CreateDomain(...).CreateInstanceAndUnwrap(...) 或 Assembly.LoadFrom(...).GetExportedTypes() 抛

Assembly.LoadFrom加载程序集类型转换失败解决方法

为C# as 类型转换及Assembly.LoadFrom埋坑!

LoadFrom 和上下文