none
C#调用MFC dll问题 RRS feed

  • 问题

  • C++有个CPerson类,

    C++/CLR里面有个Person类,对CPerson能进行包装

    C#引用C++/CLR的Person类

    第一种方式. C#调用-> C++/CLR -> 调用C++的DLL(WIN32工程)

    第二种方式. C#调用-> C++/CLR -> 调用C++的DLL(MFC工程)

    第一种没有问题

    第二种有问题,在C#里面压根就不能new C++/CLR里面的Person,一new就报错,报的错也很奇怪:

    Person person = new Person(); // 不加这一行不报错
    
    public MainWindow()
    {
        InitializeComponent();
    }
    引用C++/CLR库没有问题,但就不是不能new

    • 已编辑 oneonce 2017年8月26日 2:15
    2017年8月26日 2:07

答案

全部回复

  • 第一种方式的架构是WIN32, 第二种方式的架构可能是x64,尝试将C#程序调整为x64架构。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年8月28日 0:10
  • 第一种方式的架构是WIN32, 第二种方式的架构可能是x64,尝试将C#程序调整为x64架构。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    那个问题解决了,是DLL没有设置支持运行时clr

    现在发现另外一个问题,release版本在win8上跑不起来,开发机器(windows10)可以。也安装了VS2015运行时库(vc_redist.x86.exe),win8是32位的。win10是64位的,编译选项也是x86.

    没看到什么报错,就是起不来。

    2017年8月28日 0:52
  • 你好oneonce,

    请注意,每个线程应该是一个问题。如果你有另外一个问题, 请通过mark有帮助的答复以关闭一个当前的线程,并为你的新问题开启一个新的线程。我发现你已经在英文论坛发了新的问题,因为重发发帖也是不被允许的,所以你不必在中文论坛发新帖了。

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/1d6c9345-fc2b-4c07-a5c4-f1a21d74335b/the-application-can-not-run-on-windows78?forum=wpf

    我们感谢你的合作和理解。

    对于你的新问题, 下面是我的建议:

    首先,建议你检查你的.NET Framework的版本是否是和你的APP所需的.NET Framework匹配,同时,检查任意的Win8中可能没有的依赖性。

    如何:确定安装了哪些 .NET Framework 版本

    https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed 

    其次,尝试在你的WPF App类中,捕捉全局的异常。

    Application.DispatcherUnhandledException Event

    https://msdn.microsoft.com/zh-cn/library/system.windows.application.dispatcherunhandledexception(v=vs.110).aspx

    AppDomain.CurrentDomain.UnhandledException

    https://msdn.microsoft.com/zh-cn/library/system.appdomain.unhandledexception(v=vs.110).aspx

    最后,转到Windows事件日志中的应用程序日志查看是否有相关的日志记录。

    另外,你是通过什么方式部署你的WPF程序的? 有没有在其他的Win8上进行测试,所以是在所有的Win8上都会出现这个状况吗?

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.





    2017年8月28日 7:55
    版主
  • 确实发生了异常,异常提示找不到托管dll或者托管dll的依赖也就是MFC的dll。

    搞不懂了,眼睛都看到有这2个dll,不知道哪里有问题,MFC库设置了“公共语言运行时支持(/clr)”。依赖项看了没有问题。


    发布里面看上去也没问题

    • 已编辑 oneonce 2017年8月28日 8:41
    2017年8月28日 8:37
  • 你好,

    问题应该是没有正确引用非CLR的DLL, 查看发布文件夹下是否有这个DLL.

    1.将依赖DLL添加到解决方案中,与主DLL放在相同目录下(重要),然后设置DLL的属性CopyToOutputDirectory= CopyAlways,编译器就会自动查找DLL。

    在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

    [原创]C#引用C++编译的dll

    2.在引用托管DLL的每个项目中创建一个Post-build event。使用Post-build event复制命令,以将本机DLL从源复制到目标。

    如何使用VS的Build Events

    build event command line

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年8月28日 9:04
    版主
  • CopyToOutputDirectory= CopyAlways没找到在哪。

    但是我编译C#工程时会自动编译3个工程,从MFC dll开始到托管C++,最后到C#工程,顺序没有问题。

    编译后MFC和托管C++的dll都会自动拷贝到C#工程release目录下面。

    2017年8月28日 9:48
  • Hi,

    >>CopyToOutputDirectory= CopyAlways没找到在哪。

    找打工程中的dll文件,直接右键属性。

    >> 编译后MFC和托管C++的dll都会自动拷贝到C#工程release目录下面。

    那说明已经成功添加,你的编译应该没有问题吧,所以排除编译的问题,那可能是部署出现了问题。

    你把你的程序放置值IIS上了吗? 你查看一下你的IIS有没有配置MIME Types 。

    https://msdn.microsoft.com/zh-cn/library/bb742440.aspx

    然后我建议你查看一下clickOnce 的安装目录下,看看这个DLL有没有下载成功。

    ClickOnce 安装目录 c:\users\username\AppData\Local\Apps\2.0\...\...

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年8月28日 10:14
    版主
  • 编译没问题。

    编译出来的程序是放在我们的产品里面(产品运行win10/8/7系统中)。

    为什么不能添加附件呢!要不然把工程附上来。

    2017年8月29日 1:25
  • Hi,

    >>为什么不能添加附件呢!要不然把工程附上来。

    建议你使用Onedrive上传你的工程。

    https://support.office.com/en-us/article/Share-OneDrive-files-and-folders-9fcc2f7d-de0c-4cec-93b0-a82024800c07

    根据你的描述,你的程序已经使用ClickOnce发布好了,那么请你附上你的ClickOnce安装的页面,我看看我这边能不能安装运行。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年8月29日 1:35
    版主
  • Hi,

    >>为什么不能添加附件呢!要不然把工程附上来。

    建议你使用Onedrive上传你的工程。

    https://support.office.com/en-us/article/Share-OneDrive-files-and-folders-9fcc2f7d-de0c-4cec-93b0-a82024800c07

    根据你的描述,你的程序已经使用ClickOnce发布好了,那么请你附上你的ClickOnce安装的页面,我看看我这边能不能安装运行。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    OneDrive公司登不上,我放在了百度网盘里面:

    https://pan.baidu.com/s/1o8yrqYm

    2017年8月29日 1:53
  • 你好,

    你打包好的程序在我这边也没有办法运行,显示相同的错误。

    我使用Fuslogvw.exe(程序集绑定日志查看器)这个工具来查看是否找到这个程序集时,显示成功加载。

    以下是日志内容:

    <meta http-equiv="Content-Type" content="charset=unicode-1-1-utf-8"><!-- saved from url=(0015)assemblybinder: --><html><pre>
    *** Assembly Binder Log Entry  (8/29/2017 @ 10:25:55 AM) ***
    
    The operation was successful.
    Bind result: hr = 0x0. The operation completed successfully.
    
    Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
    Running under executable  C:\Users\V-WEDI\AppData\Local\Apps\2.0\Y9B00M24.PCQ\H6LKT0K5.CAZ\csha..tion_c073be035e7c1af4_0001.0000_015b571284cb4075\CSharpCallCLR.exe
    --- A detailed error log follows. 
    
    === Pre-bind state information ===
    LOG: DisplayName = ManageCppDll, Version=1.0.6450.17626, Culture=neutral, PublicKeyToken=null
     (Fully-specified)
    LOG: Appbase = file:///C:/Users/V-WEDI/AppData/Local/Apps/2.0/Y9B00M24.PCQ/H6LKT0K5.CAZ/csha..tion_c073be035e7c1af4_0001.0000_015b571284cb4075/
    LOG: Initial PrivatePath = NULL
    LOG: Dynamic Base = NULL
    LOG: Cache Base = NULL
    LOG: AppName = CSharpCallCLR.exe
    Calling assembly : CSharpCallCLR, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
    ===
    LOG: This bind starts in default load context.
    LOG: Using application configuration file: C:\Users\V-WEDI\AppData\Local\Apps\2.0\Y9B00M24.PCQ\H6LKT0K5.CAZ\csha..tion_c073be035e7c1af4_0001.0000_015b571284cb4075\CSharpCallCLR.exe.config
    LOG: Using host configuration file: 
    LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
    LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
    LOG: Attempting download of new URL file:///C:/Users/V-WEDI/AppData/Local/Apps/2.0/Y9B00M24.PCQ/H6LKT0K5.CAZ/csha..tion_c073be035e7c1af4_0001.0000_015b571284cb4075/ManageCppDll.DLL.
    LOG: Assembly download was successful. Attempting setup of file: C:\Users\V-WEDI\AppData\Local\Apps\2.0\Y9B00M24.PCQ\H6LKT0K5.CAZ\csha..tion_c073be035e7c1af4_0001.0000_015b571284cb4075\ManageCppDll.dll
    LOG: Entering run-from-source setup phase.
    LOG: Assembly Name is: ManageCppDll, Version=1.0.6450.17626, Culture=neutral, PublicKeyToken=null
    LOG: Binding succeeds. Returns assembly from C:\Users\V-WEDI\AppData\Local\Apps\2.0\Y9B00M24.PCQ\H6LKT0K5.CAZ\csha..tion_c073be035e7c1af4_0001.0000_015b571284cb4075\ManageCppDll.dll.
    LOG: Assembly is loaded in default load context.
    
    </pre></html>

    所以,加载程序集是成功的。问题可能出现在方法调用上,建议你贴出MainWindow的代码。

    而且你最好把编译好的exe(debug文件夹)分享给我们,而不是部署后的文件。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.




    2017年8月29日 2:56
    版主
  • 我把部署后的文件给同事可以运行。。。

    我上传了工程文件上去了。

    应该还有一个dll(NativeCppDll.dll)没加载起来


    • 已编辑 oneonce 2017年8月29日 3:09
    2017年8月29日 3:08
  • Hi,

    >> 我把部署后的文件给同事可以运行。。。应该还有一个dll(NativeCppDll.dll)没加载起来

    既然你把部署后的文件给同事可以运行,那说明你的程序没有问题,如果程序用到了这个DLL,那说明这个DLL也被加载了,所以我认为这还是一个部署的问题。

    所以我建议你查看一下你程序需要的依赖性,特别是NativeCppDll所需的依赖项,然后在目标机器上安装好这些依赖项。

    ClickOnce部署可以使用先决条件来提前安装依赖项,我不知道为什么你要copy文件?

    你点击VS中如上面的图片的所示,查看需要安装哪些依赖项。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年8月29日 9:01
    版主
  • 非常感谢你的回复。

    我看了只要3个:

      1) .Net framework 4.5.2

      2) Visual C++ “14” Runtime libraries(x86)

     3) Windows Installer 4.5

    这3个都装了~~~

    2017年8月29日 9:41
  • Hi,

    首先,你确定你的目标机器上已经安装了这三个依赖项? 请尝试在多台不同的window8设备上进行测试。

    另外,建议你使用 depends.exe来查看应用程序的依赖项。从这可以下载:http://www.dependencywalker.com/

    还有,关于VC++程序的ClickOnce部署,你可以参考 : Visual C++ 应用程序的 ClickOnce 部署

    如果还是没有找到原因,我建议你使用WinDbg工具来调试你的程序。

    https://developer.microsoft.com/en-us/windows/hardware/download-windbg

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年8月29日 10:08
    版主