使用XML并在其中添加c#逻辑以进行配置

使用XML并在其中添加c#逻辑以进行配置,c#,xml,parsing,roslyn,canopen,C#,Xml,Parsing,Roslyn,Canopen,我正在开发一个软件来配置通过CANOpen进行通信的设备。在CANOpen中,有一个对象字典(OD)的概念,它在消费者和生产者之间共享。它充当通信端点之间的契约 为了定制我们希望在应用程序中可视化的内容,我们正在用XML构建一个配置文件。一个例子是可以在设备上执行的命令。例如,您需要将机器人的手臂向上移动500毫米。然后,我希望能够将此命令定义为“移动手臂Z轴”,并指定具有特定约束(最小、最大等)的特定类型的参数 我想采用的方法是使用每个设备的xml文件,在该文件中可以定义所有这些步骤。但是,它

我正在开发一个软件来配置通过CANOpen进行通信的设备。在CANOpen中,有一个对象字典(OD)的概念,它在消费者和生产者之间共享。它充当通信端点之间的契约

为了定制我们希望在应用程序中可视化的内容,我们正在用XML构建一个配置文件。一个例子是可以在设备上执行的命令。例如,您需要将机器人的手臂向上移动500毫米。然后,我希望能够将此命令定义为“移动手臂Z轴”,并指定具有特定约束(最小、最大等)的特定类型的参数

我想采用的方法是使用每个设备的xml文件,在该文件中可以定义所有这些步骤。但是,它确实要求我使用特定的解析规则在xml中编写c代码,例如任何代码都应该位于“{”“}}”括号之间或使用特定元素(例如


我们的想法是使用Roslyn脚本api在解析语法后执行和评估代码


我想知道你的想法,如果你知道一个更好的方法来处理这个案件。我有一个问题,就是我有有限的方法来防止恶意代码潜入。但是,该代码仅在本地计算机上运行,不在云中或其他服务器上,因此您只会弄乱自己的设备。

Xml中的值通常放在innertext中,而不是作为属性。在读取Xml之后和实际处理之前,是否可以执行某些功能?是的,这就是想法。我想在解析完xml后,为其中的一些创建Action或Func实例,这些实例在执行命令时被调用。现在还没有什么真实的东西,这一切都还在我的脑海里。定义一组命令会更容易。在XML中,插入一个带有名称和参数的命令标记。并根据XML中的命令执行所需的函数。这样会更安全(没有奇怪的代码)、稳定(只有您定义的函数才能执行)和可维护(函数可以单独测试和调试)谢谢您的建议,我明白您的意思。问题是,当我们需要添加另一种需要更多硬编码功能的设备时,我们希望对代码进行最小的更改。我确实意识到我们不能让它太复杂,因为调试这个自定义解析代码很困难。我也不想需要一张备忘单来学习所有可用的命令。
<?xml version="1.0" encoding="UTF-8"?>
<DeviceConfiguration>
  <Device name="CanOpenDevice1" />
  <ParameterConfiguration>
    <EntreesToExclude>
      <EntryToExclude Index="0x206B" />
      <EntryToExclude Index="0x2050" />
      <EntryToExclude Index="0x20F1" />
      <EntryToExclude Index="0x20F4" />
    </EntreesToExclude>
    <WriteToFlashCommand>
      <WriteCommand Label="Write to Flash" Index="0x3000" SubIndex="0x0F" Value="0x000000FF" />
    </WriteToFlashCommand>
  </ParameterConfiguration>
  <CommandConfiguration>
    <Commands>
      <WriteCommand Label="Connect Request ON" Index="0x20F2" Value="true" DataType="bool" />
      <WriteCommand Label="Connect Request OFF" Index="0x20F2" Value="false" DataType="bool" />
      <WriteCommand Label="Clear Faults" Index="0x2050" SubIndex="0x01" Value="0x66726c63" DataType="uint" />
      <WriteCommand Label="Reboot" Index="0x2050" SubIndex="0x02" Value="0x00747372" DataType="uint" />
      <!-- Executes in sequential order -->
      <CommandInstructionSet Label="Sync RTC">
        <SetVariable Name="now" Value="{{System.Datetime.UtcNow}}" />
        <WriteCommand Index="0x206B" SubIndex="0x05" Value="{{$now.Second}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x06" Value="{{$now.Minute}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x07" Value="{{$now.Hour}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x08" Value="{{$now.Day}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x09" Value="{{$now.Month}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x0A" Value="{{$now.Year - 2000}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x0B" Value="{{System.DateTime.IsLeapYear($now.Year)}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x0C" Value="{{$now.DayOfWeek}}" DataType="ushort" />
        <WriteCommand Index="0x206B" SubIndex="0x0E" Value="0x12345678" DataType="uint" />
      </CommandInstructionSet>

      <ReadCommand Label="Reboot" Index="0x2050" SubIndex="0x02" DataType="uint" />
    </Commands>
  </CommandConfiguration>
</DeviceConfiguration>