【问题标题】:Is it possible to create a structure by user input, a definition file or similar at runtime in vb.net?是否可以在运行时在 vb.net 中通过用户输入、定义文件或类似文件来创建结构?
【发布时间】:2014-05-28 08:03:53
【问题描述】:

虽然我的具体情况是与我在示例中提到的第三方库打交道,但我认为这个问题适用于更广泛的受众,因为它的核心是关于动态结构的创建。

背景:

我目前正在编写一个自动化应用程序,该应用程序使用第三方库与可编程逻辑控制器 (PLC) 进行通信。从 PLC 读取用户定义的数据类型(类似于 vb.net 结构,但其中只有值,没有方法或属性等)时,第三方库将从 PLC 读取数据作为块,没有不管它是单个变量还是数组。然后我需要提供一个 vb.net 数据类型作为与 PLC 中的匹配结构,以将读取的数据块映射到我的程序中适当的结构成员。

例子:

在 PLC 中,我有一个包含两个 32 位数字的数据类型,一个称为 IndexCount,一个称为 Zone。要读取该数据类型的一个标签或变量,我需要在 vb.net 中指定匹配的数据类型(名称不必匹配,但数据类型必须匹配)

Private Structure RecordUDT
    Dim IndexCount As Int32
    Dim Zone As Int32
End Structure

然后我通过声明我自己结构的变量并使用第三方包提供的编码器来读取数据。 (实际应用中上一行PLC数据已经读入'plcData')

dim myData as RecordUDT
myData = thirdPartyEncoder.ToType(plcData, 0, GetType(RecordUDT)) 'Convert the data in 'plcData' to a RecordUDT type

我现在可以查看 myData.Zone,它与 PLC 中的 .zone 成员具有相同的值。

问题:

第三方编码器要求我提供数据类型,本例中为 RecordUDT,如下行:

myData = thirdPartyEncoder.ToType(plcDataBlock, 0, GetType(RecordUDT)) 'Convert the data in 'plcData' 

我知道如何定义结构的唯一方法是在上面的背景中。这样做的缺点是 PLC 可以拥有我或其他用户想要阅读的任意数量的自己的结构,这意味着我必须制作一个新版本的软件,每次都将结构硬编码在其中他们想读一本新书。除了结构定义和上面的行之外,程序本身是相同的,它将提供新结构的名称。

有没有办法制作动态结构,以便它们可以在运行时创建,或者通过在启动时读取的文件中输入信息(或类似的东西)?

如果没有,是否有另一种方法来解决这个问题,而不必在每次需要添加新结构时分发新版本的应用程序?

到目前为止我做了什么:

大量阅读却一无所获,因为我陷入了第一个问题,即结构创建...我在 Google 和 SO 上搜索了以下内容:

“vb.net 在运行时创建结构”和“vb.net 在运行时创建结构”

《vb.net动态结构》

《.net动态结构》

".net 在运行时创建结构"

我发现this article 显示了一些希望,但它是用 C 语言编写的,超过了我的 C 技能,我不知道是否可以在 .NET 的托管设计范围内制作类似的系统。 This answer 也有相似之处,但没有解决结构的动态创建。 大多数其他类似的结果是指数据库,而答案一直是使用数据库过程而不是动态结构,这对我也没有帮助(据我所知)。

我在下面的线程dynamically-create-structure 中得到了希望,但答案中提到的两个主要链接是 404,未找到 :-(

根据我所读到的内容,由于缺乏信息和诸如“如果您动态创建结构,您将如何引用它”等信息的缺乏,这似乎没有完成。很多它暗示这是不可能或不明智的,但我非常怀疑在这种情况下,我是唯一一个在每次用户需要新结构时都需要新版本软件的人,这可能很常见。

如果有人能指出我正确的方向,我将不胜感激。我也意识到正确的方向可能与我前进的方向完全不同,但我不介意转身:-)

【问题讨论】:

    标签: .net vb.net dynamic structure


    【解决方案1】:

    当我研究更深入的 Java 主题时,我遇到了一些类似的情况。我的搜索基本上是徒劳的,直到我遇到了所谓的概念——通用类型。为保存和接受来自许多不同类型的数据而编写的脚本。然后,当接口更改时,最坏的情况是,您只需要更新阅读器以传递库所期望的内容,但将返回一个通用对象列表,一旦确定它们的类型,您就可以稍后处理这些对象,识别键,然后它们可以处理。从MSDN 开始。我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      相关资源
      最近更新 更多