【问题标题】: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 关键字,因为您使用的是指针。
  • 大声笑,我相信你是对的。这样做更有意义,因为如果有这些指针,这将是不安全的。

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


【解决方案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*。
    • 确实,只是说明性的。这会奏效的几率为零。
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多