使用C+时遇到错误+;旧MFC/Win32应用程序上的互操作 我继承了一个旧的MFC/Win32 C++应用程序,我不应该编辑源代码。 此MFC应用程序需要托管一个旧的MFC/Win32 C++ DLL。此DLL还尝试通过混合模式包装器对托管C++/CLI DLL进行函数调用。我知道这听起来有点让人困惑,下面是我的意思: Old MFC/Win32 Application (NO CLR) ---> Hosting old MFC/Win32 DLL (NO CLR) ---> Making function calls to Mixed-Mode wrapper (CLR) ---> Sending function calls to C++/CLI DLL (CLR)
我目前的问题是,当我尝试挂载C++/CLR包装类的对象时,比如说使用C+时遇到错误+;旧MFC/Win32应用程序上的互操作 我继承了一个旧的MFC/Win32 C++应用程序,我不应该编辑源代码。 此MFC应用程序需要托管一个旧的MFC/Win32 C++ DLL。此DLL还尝试通过混合模式包装器对托管C++/CLI DLL进行函数调用。我知道这听起来有点让人困惑,下面是我的意思: Old MFC/Win32 Application (NO CLR) ---> Hosting old MFC/Win32 DLL (NO CLR) ---> Making function calls to Mixed-Mode wrapper (CLR) ---> Sending function calls to C++/CLI DLL (CLR),c++,winapi,mfc,c++-cli,clr,C++,Winapi,Mfc,C++ Cli,Clr,我目前的问题是,当我尝试挂载C++/CLR包装类的对象时,比如说WrapperClass WC,MFC/Win32应用程序遇到“未处理的异常” 我有一种感觉,我可能需要以某种方式在一个单独的进程中托管CLR,以便能够创建对象。这是正确的想法吗?还是我完全疯了 代码在编译时进行编译,这只发生在运行时 有什么想法吗 下面是我尝试运行的代码示例: MFC/win32dll 混合模式包装类 更新: 我设法诱使一个真正的例外退出了这个计划。我现在收到一个System.IO.FileNotFound异常,附
WrapperClass WC代码>,MFC/Win32应用程序遇到“未处理的异常”
我有一种感觉,我可能需要以某种方式在一个单独的进程中托管CLR,以便能够创建对象。这是正确的想法吗?还是我完全疯了
代码在编译时进行编译,这只发生在运行时
有什么想法吗
下面是我尝试运行的代码示例:
MFC/win32dll
混合模式包装类
更新:
我设法诱使一个真正的例外退出了这个计划。我现在收到一个System.IO.FileNotFound
异常,附加信息说明:
An unhandled exception of type 'System.IO.FileNotFoundException' occured in
Unknown Module.
Additional information: Could not load file or assembly 'CPPCLIProject,
Version=1.0.4351.29839, Culture=neutral, PublicKeyToken=null' or one of its
dependencies. The system cannot find the file specified.
这有什么意义吗?我知道它显然找不到CPPCLIProject(注意:这不是包装器项目),但是如果我从混合模式包装器链接.lib文件,我怎么会不会收到链接器错误呢?你最好的选择是
- 在调试器下运行(将带有调试信息的附加DLL添加到调试会话)
- 启用所有(第一次机会)异常的中断
- 跟踪/断言所有HRESULT代码
- 一般来说,试着抓住
- C++异常(
try/catch
…)
- Windows结构化异常(IIRC\u try/\u catch,但是)
其思想是将“未知异常”转换为“已知异常”
通常来说,不需要在进程外托管CLR部件。这就是混合模式DLL的意义所在。然后,如果这是遗留代码,那么您可能会遇到运行时依赖关系的复杂混合,我们可以说,这可能会发生冲突
进一步思考:
如果我理解正确,您可以选择重新编译所有源代码(只是不接触遗留代码库?)。如果是这样,请确保所有代码都是根据运行库的相同版本(想想Service Pack)和类型(想想静态与动态/多线程/调试)编译的
当您检查其他路径时,请密切关注可能存在冲突的依赖项
- ATL服务器库
- MFC libs(同样是静态与动态/多线程/调试风格)
你最好的选择是
- 在调试器下运行(将带有调试信息的附加DLL添加到调试会话)
- 启用所有(第一次机会)异常的中断
- 跟踪/断言所有HRESULT代码
- 一般来说,试着抓住
- C++异常(
try/catch
…)
- Windows结构化异常(IIRC\u try/\u catch,但是)
其思想是将“未知异常”转换为“已知异常”
通常来说,不需要在进程外托管CLR部件。这就是混合模式DLL的意义所在。然后,如果这是遗留代码,那么您可能会遇到运行时依赖关系的复杂混合,我们可以说,这可能会发生冲突
进一步思考:
如果我理解正确,您可以选择重新编译所有源代码(只是不接触遗留代码库?)。如果是这样,请确保所有代码都是根据运行库的相同版本(想想Service Pack)和类型(想想静态与动态/多线程/调试)编译的
当您检查其他路径时,请密切关注可能存在冲突的依赖项
- ATL服务器库
- MFC libs(同样是静态与动态/多线程/调试风格)
您确定
WrapperClass::FunctionToCall()
的实现没有引发异常吗?看起来您正在缓存CLR对象的内存位置,然后尝试调用其成员之一。我认为CLR可以自由移动对象,因此您可能试图使用已移动的对象
如果将WrapperClass::FunctionToCall()
的实现更改为简单的实现(即创建CLR对象,调用成员函数),是否仍会得到相同的未处理异常
更新:哪个类在CPPCLIProject-CPPCLIClass中?假设这个项目代表C++/CLI DLL,听起来好像它在需要调用类时找不到加载它的程序集
相对于应用程序的其余部分,此程序集在磁盘上的什么位置?如果您的根EXE是非托管的(听起来像是这样,因为它是MFC/Win32),那么CLR会在EXE目录和GAC中查找以加载程序集(我认为它不会在路径中查找,但我不确定)
因此,如果CPPCLIProject与EXE不在同一目录中,这可能是您的问题。您确定WrapperClass::FunctionToCall()
的实现没有引发异常吗?看起来您正在缓存CLR对象的内存位置,然后尝试调用其成员之一。我认为CLR可以自由移动对象,因此您可能试图使用已移动的对象
如果将WrapperClass::FunctionToCall()
的实现更改为简单的实现(即创建CLR对象,调用成员函数),是否仍会得到相同的未处理异常
更新:哪个类在CPPCLIProject-CPPCLIClass中?假设这个项目代表C++/CLI DLL,听起来好像它在需要调用类时找不到加载它的程序集
相对于应用程序的其余部分,此程序集在磁盘上的什么位置?如果你的根前
BOOL WrapperClass::FunctionToCall(DWORD dw)
{
GCHandle h = GCHandle::FromIntPtr(IntPtr(m_impl)); //m_impl def'd as void *
CPPCLIClass^ CCC = safe_cast<CPPCLIClass^>(h.Target);
return (BOOL)CCC->FunctionToCall(dw);
}
bool CPPCLIClass::FunctionToCall(UInt32 ui32)
{
if (ui32 == 42)
{
return true;
}
}
An unhandled exception of type 'System.IO.FileNotFoundException' occured in
Unknown Module.
Additional information: Could not load file or assembly 'CPPCLIProject,
Version=1.0.4351.29839, Culture=neutral, PublicKeyToken=null' or one of its
dependencies. The system cannot find the file specified.