使用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+时遇到错误+;旧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异常,附

我目前的问题是,当我尝试挂载C++/CLR包装类的对象时,比如说
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.