此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

Posted

技术标签:

【中文标题】此 Canon SDK C++ 代码片段的等效 C# 代码是啥?【英文标题】:What is the equivalent C# code for this Canon SDK C++ code snippet?此 Canon SDK C++ 代码片段的等效 C# 代码是什么? 【发布时间】:2010-09-23 15:48:53 【问题描述】:

这个 C++ 代码的 C# 等价物是什么?

private:
    static EdsError EDSCALLBACK ProgressFunc (
                        EdsUInt32   inPercent,
                        EdsVoid *   inContext,
                        EdsBool *   outCancel
                        )
    
        Command *command = (Command *)inContext;
        CameraEvent e("ProgressReport", &inPercent);
        command->getCameraModel()->notifyObservers(&e);
        return EDS_ERR_OK;
    

【问题讨论】:

我在这里看不到任何 C# 特定的构造。使用适当的 API,这应该像 C++ 一样工作。 @Michael - 我相信 OP 希望看到 C# 等价于它所做的任何事情 我认为 OP 将此代码作为 C++ 并试图转换为 C#,而不是相反。也就是说,它应该可以工作,但是您需要使用 unsafe 关键字,因为您使用的是指针。 大声笑,我相信你是对的。这样做更有意义,因为如果有这些指针,这将是不安全的。 【参考方案1】:

字里行间 - 佳能 SDK here 和另一个 here 有一个 .Net 2.0 包装器(包括源代码)

【讨论】:

【参考方案2】:

这是一个粗略的翻译,用于说明目的:

private static void ProgressFunc(uint percent, object context, out bool cancel)

    Command command = (Command)context;
    CameraEvent e = new CameraEvent("ProgressReport", percent);
    command.GetCameraModel().NotifyObservers(e);
    cancel = false;

(EdsError 已更改为void,因为我们在 C# 中使用异常而不是错误代码;EDSCALLBACK 定义为 __stdcall,这与此处无关;该代码仅在所有隐含的类和方法时才有效存在;惯用的 C# 将使用 event/EventHandler/EventArgs 而不是“NotifyObservers”方法;我假设您不想与 C++ 进行任何互操作。

【讨论】:

我们也在 C++ 中使用异常。在我看来,这就像 COM 或类似的互操作 API - 没有充分的理由,没有人会使用 void*。 确实,只是说明性的。这会奏效的几率为零。

以上是关于此 Canon SDK C++ 代码片段的等效 C# 代码是啥?的主要内容,如果未能解决你的问题,请参考以下文章

自 c# 以来的 c++ 代码等效? [关闭]

System.arraycopy() 等效于 C、C++ 或 Objective-C

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

C++ typedef struct 等效于 C#

CANON SDK 将自定义白平衡设置为保存的 JPG 图像

C# RSA 等效于 C++ Crypto API 的代码