【问题标题】:Getting c# and c++ to play nice together让 c# 和 c++ 一起玩得很好
【发布时间】:2013-04-04 18:33:00
【问题描述】:

我有一个通过 COM 访问 c++ 项目的 c# 解决方案。该项目必须针对特定的处理器,在本例中为 x64。我正在使用 Windows 安装程序来安装应用程序。

我遇到的第一个问题是安装时没有正确注册c++ dll,程序无法访问它。我通过将 c++ 项目添加到解决方案中解决了这个问题。

这工作了一段时间,并且一切都安装正确,但是当我尝试构建时开始收到以下警告:

项目中 .NET Framework 的目标版本与 .NET Framework 启动条件版本“.NET Framework 3.5”不匹配。在高级编译选项对话框 (VB) 或应用程序页面(C#、F#)中更新 .NET Framework 启动条件的版本以匹配 .NET Framework 的目标版本。

如果我尝试忽略警告,安装程序将无法安装。经过一番搜索,我发现 c++ 项目是在 .NET 4.0 中构建的,而我的解决方案使用的是 .NET 3.5。我尝试将我的解决方案更改为 4.0,但由于某种原因它停止工作,所以我将 c++ 更改为 3.5。

这适用于几个构建,但后来我开始收到以下错误:

Error: LNK1104 cannot open file 'mfc90.dll'. 

我将文件添加到附加依赖项部分,但随后出现另一个链接错误 (mfcs90.dll),在添加该文件时,我遇到了 x86 x64 冲突。

我不确定为什么这些解决方案工作了一段时间然后就停止了,而且我似乎无法在任何可行的步骤中找到解决方案。如果有人看到过类似的东西,我们将不胜感激。

【问题讨论】:

    标签: c# c++ .net windows-installer


    【解决方案1】:

    为了包含 Microsoft 运行时 dll,您不应简单地将 dll 包含在您的应用程序目录中。当 dll 具有不同的依赖关系并且您可能会遇到不同的冲突和版本控制问题时,这将无济于事。

    我建议为您的应用程序安装运行时 dll 的方法是在您的 MSI 中包含官方合并模块。

    有关重新分发运行时库的选项,请参阅以下链接:

    http://msdn.microsoft.com/en-us/library/ms235316(v=vs.90).aspx

    【讨论】:

    • 感谢您的回复。我确实花了一些时间尝试在 c++ 代码中创建一个合并模块,但我没有成功。这是前一段时间,所以我不记得我得到的具体错误。但是,我没有在 c# 代码中尝试合并模块。我想知道这样会不会有更好的结果?
    • 不客气。我不确定“在代码中创建合并模块”是什么意思。合并模块用于安装,而不是用于代码。并且您不应该创建新的合并模块,您应该从 Microsoft 下载官方的 Visual C++ 运行时合并模块并将其包含在您的 MSI 中。
    • 请原谅我的无知,但我是 C++ 新手。我使用的代码是开源的。你是说我应该添加合并模块并在C++项目中创建一个安装程序,然后将msi添加到c#安装程序中。再次感谢您分享您的知识。
    • @Tim - 我建议您退后一步,花一些时间了解有关 Microsoft 安装包和 Visual Studio 安装项目的更多信息。 (例如,MSI 是一个安装包。“将 msi 添加到 c# 安装程序”是没有意义的。)
    • @Tim - 很高兴看到您的工作顺利进行。安装项目几乎与语言/平台无关(这就是为什么它是一个单独的项目)。您应该能够将安装项目指向您的其他项目。它将自动检测这些项目的输出(取决于您如何配置它们)。然后,您可以配置如何将该输出安装到目标机器上。安装项目的输出是最终的完整 MSI(或 setup.exe)。您通常不需要将已完成的安装包添加到另一个安装包中。
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 2012-11-27
    • 2015-04-30
    • 2011-03-16
    • 2016-11-13
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多