【问题标题】:Unmanaged code in .Net.Net 中的非托管代码
【发布时间】:2012-05-17 22:00:15
【问题描述】:

我们有一个基于here 的 Codeproject TreeGrid 示例的 C++ 项目中的自定义 Listview Treegrid。随着时间的推移,代码已经进行了相当广泛的修改。

我需要将 c++ 项目移植到 C# Winforms。我正在考虑为 Listview 网格创建一个 c++ dll 并在 Winforms 中与它进行互操作。

我在 Winforms 中使用非托管 Listview 控件是否自找麻烦?我应该只移植/重写 Winforms 中的列表视图吗? (我也不期待的任务)

【问题讨论】:

  • 我想如果有人要求你从 C++ 移植到 C#,他们可能不希望移植版本中有本机代码。
  • 唯一的要求是获得 Winforms 应用程序的外观和感觉。我正在探索如何做到这一点的选项。
  • 不太熟悉它是如何工作的?我还需要 dll 吗?
  • 对不起,我不太了解。见这里:en.wikipedia.org/wiki/C%2B%2B/CLI

标签: c# visual-c++ winforms-interop


【解决方案1】:

我认为最好在托管代码中重新编写它。

互操作性通常有效,但首选托管代码是有原因的。运行时为您处理了很多事情,而且更容易维护。对于某些任务来说,跨越边界可能会有问题。例如,您还会失去代码访问安全性。有一些很好的信息here

如果您不这样做,那么您将始终需要一个 .NET 开发人员和一个 c++ 开发人员来维护它。

c++/native 代码本身并没有什么问题,但是将两者混合使用。我只是认为最好不要长期混合,除非你必须这样做。

也就是说,存在时间和预算限制。互操作的存在是有原因的。如果从商业角度证明绝对需要太长时间,我会撤回上述建议。

【讨论】:

  • 我明白你对所有必要的编组/清理代码的意思。我考虑互操作的唯一原因是时间和预算。此外,c++ 版本将继续存在,所以如果我们移植,那么我们有两个代码库需要维护。
  • 这些听起来像是正当的理由。这真的取决于你。 个人如果是我们的代码,我会移植它,但我倾向于移植所有内容。为我们保持代码库更新意味着以后的维护工作更容易。但这听起来对你来说不是问题,我认为你有正当理由只使用非托管版本,只要它没有任何问题。
【解决方案2】:

如果我是你,我更愿意用 C# 重写 Listview,或者寻找一个免费或付费的用 C# 编写并打算在 Winforms 中使用的 Grid。

别忘了,完成这项工作后,你必须支持代码, 这可能包括修复错误和添加功能。 最好确切地知道你的代码是如何工作的以及如何调试它。 您还可以编写更适合您需求的 Listview。

如果您将使用此 C++ Listview 并在 Winforms 中使用它,这将非常困难。 但是,如果您决定使用它,我可以想到两种选择:

  1. 在 C++/CLI 中为 Listview 创建一个包装器,用于保存对象并在 C# 中显示数据,这意味着您必须编写大量转换代码才能将数据从 Listview 移动到C# 对象,但它应该可以工作。

  2. 使用 DllImport 并使用 ListView 作为数据源,我不确定您将如何准确地从中获取所有数据,但它会阻止您编写丑陋的 CLI 代码...

总结一下,我建议对 UI 代码使用单一语言,我选择的 UI 语言是 C#,而不是 C++。

祝你好运……

【讨论】:

  • 感谢 Shahar...我开始看到保留 c++ 版本会是多么混乱。除非我能找到免费/付费的网格,否则我会移植。我给你检查答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多