有人可以阐明如何从 vc 创建 c# 自定义控件吗?我需要创建一些将在 C# 项目中使用的图形控件,如默认控件,因为性能很重要,而且它在低性能 Windows CE 设备上,我想我必须在 c/cpp 中完成。
3 回答
简单直接的答案是你不能。时期。Compact Framework 不支持托管 C++ (C++/CLI)。现在我想您可以将 UI 组件创建为 COM 控件,然后手动滚动托管端的所有 COM 接口内容,但这对于构建、调试和部署来说将是一场噩梦。
您最好只使用不安全的代码,然后在 C# 代码中使用 P/Invokes 来访问您所追求的 Win32 API。对于大多数事情,您可以实现您想要的并获得良好的性能。如果您有一些绝对必须在 C 中完成以提高速度的东西,那么创建一个库,您可以通过 P/Invoke 将缓冲区传递给该库。例如,Imaging 库使用这种类型的机制来创建缩略图等。
您可以尝试用 C 编写一个完整的控件,并提供一个非常薄的包装器,以暴露您需要从 C# 中控制的内容。如果我们谈论的是表单控件,它不一定需要遵循 UserControl 或 Control 的模型,这有点复杂,而且这些控件的所有成本都花在了哪里。它非常苛刻。
您还可以研究 WPF,它试图在托管端完成更多工作,从而更快。它有其自身的复杂性。它通常会自行相当智能地合成/“bitblit”,但经常过火,但它比双缓冲表单控件更快(或可以),最终将在双缓冲模式下进行相同的合成,但随着大量虚假获胜消息的处理,速度会变慢。(过于简单化)
因此,与其说不,我认为这些是你的选择。同样,可以在一定程度上控制编写良好的 C 端渲染并获得接近原生性能。
编辑:
我错过了问题的 Windows CE 部分。我的错。我不知道我说的是否适用。
我假设您在谈论 WinForms 而不是 Silverlight。
你不需要。
Windows CE 上的 .NET 执行 CIL 的 JIT(与解释它的 Micro Framework 不同,如老式 Java)。在 C# 中编写控件并没有真正的性能损失。最昂贵的操作是绘制,如果您使用 C# 或 C++,那么您将使用 GDI 执行此操作,并且它在 GDI 的函数调用中,其中昂贵的操作所在,您唯一要节省的是托管和之间的编组本土领土,但这确实没有什么意义。
您可能想要使用 C++ 创建 Windows CE GUI 的唯一情况是,如果您正在使用视频或动画框架(如 Flash),并且如果您这样做,那么您将完全使用 C++ 而不是使用 .NET对于您的任何 GUI。