.Net中的非托管代码

时间:2012-05-17 22:00:16

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

我们在c ++项目中有一个自定义Listview Treegrid,它基于here的Codeproject TreeGrid示例构建。随着时间的推移,代码已被广泛修改。

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

我是否在Winforms中使用非托管Listview控件时遇到问题?我应该在Winforms中移植/重写listview吗? (我不期待的任务)

2 个答案:

答案 0 :(得分:1)

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

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

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

c ++ /本机代码本身没有任何问题,但将两者混合在一起。我认为除非必须,否则长期不要混合。

尽管如此,还是有时间和预算限制。 Interop存在是有原因的。如果从商业意义上证明这一点绝对需要很长时间,我会撤回上述建议。

答案 1 :(得分:0)

如果我是你,我宁愿在C#中重写Listview,也不愿意寻找用C#编写的免费或付费网格,并且要在Winforms中使用。

不要忘记在完成这项工作后你必须支持代码, 这可能包括修复错误和添加功能。 最好准确了解代码的工作原理以及如何调试代码。 您还可以编写一个更适合您需求的Listview。

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

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

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

  3. 所以为了把它包起来,我建议使用单一语言的UI代码,我选择的UI语言是C#,而不是C ++。

    祝你好运......