在 C#.NET 项目和 Arduino C++ 项目中共享源代码(简单结构)

Sharing source code (simple structs) in a C#.NET project and an Arduino C++ project

提问人:Inq 提问时间:11/2/2023 更新时间:11/2/2023 访问量:28

问:

我正在处理一个项目,其中我使用 TCP 在计算机上运行的 Visual Studio C#.NET 程序和在微控制器上运行的 Sketch/C++ 程序之间进行通信。我已经使用结构设置了一个协议。它们仅包含两个环境都可识别的普通变量类型。目前,它可以说完全正常......在桌面上填写一个结构,它就会出现在 Sketch 中。下面是两者上的一条消息的示例。

#pragma once

// CommonComms.h on the ESP8266.

struct VelocityChange
{
    const static char ID = 'V';
    float LeftVelocity;
    float RightVelocity;
};

using System;

// CommonComms.cs  on the Desktop

namespace Inq.Utils
{
    public struct VelocityChange
    {
        const char ID = 'V';
        float LeftVelocity;
        float RightVelocity;
    };
}

我想制作一个两个项目都可以使用的文件。只是为了在添加消息时,我只将它们放在一个地方,然后重新编译两端。我可以解决语法问题......就像隐藏使用系统一样;在ESP8266上使用时。我遇到的麻烦是......我无法在 C#.NET 程序中包含 *.h 文件,也无法在 Arduino IDE 中包含 *.cs 文件。我在互联网上做了一些搜索,但没有找到任何有用的东西。我得到的每一次命中都是关于将管理传递到/从非管理、编组等......在同一台计算机上。我的问题只是能够在两个项目中包含相同的文件。

有谁知道我该怎么做?

谢谢。

Visual Studio 似乎需要 *.cs 扩展名才能识别代码。Arduino IDE编译器(在本例中为gcc)无法识别 #include“CommonComss.cs”。我只是得到编译时错误。在Arduino IDE上,它根本看不到同一文件夹中的命名文件。在 VS 上,除非它具有 cs 文件扩展名,否则它不会确认文件和语法。

C# C++ 共享

评论


答:

0赞 Tenatus 11/2/2023 #1

您发布的两个文件具有不同的内容(对于相似的概念,c++ 与 c# 的语法不同),因此无法在两个编译器中重用其中一个文件。

如果你想重用定义,那么我认为你需要找到一种方法来自动生成源文件(例如,通过读取json文件并写入.h和.cs文件)

评论

1赞 Inq 11/2/2023
感谢您的回复,但使用 #def 类型宏可以解决此类问题。
0赞 Inq 11/2/2023 #2

实际上,解决方案是从另一个论坛提供给我的。主要问题是我假设当Arduino IDE找不到CommonComms.cs文件时,这是因为cs扩展名。事实证明,如果使用绝对路径,它可以找到并使用包含的 CS 文件。这是上面的相同示例,经过修改,允许在Arduino C++项目和C#.NET项目中使用它。它还显示了在 C++ 项目中使用 C# 语法所需的宏。

下面是 CommonComms.cs 文件

#if ARDUINO
  #pragma once
  #define public
#endif

namespace InqSim
{
    struct VelocityChange
    {
        public char ID;
        public float LeftVelocity;
        public float RightVelocity;
    };
}

#if ARDUINO
  #undef public
#endif

MyArdinoSketch.ino 修改

// The following include is shared in both the Arduino Sketch
// and the VS C#.NET project.  The Arduino IDE must use 
// an absolute path when the extension is "cs".   Also, must
// include the using namespace statement for visibility.

#include "X:\InqEgg\CommonComms.cs"
using namespace InqSim;