.net 如何使用Delphi7通过COM访问C#公共结构

.net 如何使用Delphi7通过COM访问C#公共结构,.net,delphi,com,.net,Delphi,Com,在Delphi7中,我试图使用COM读取一些C#.Net公共结构常量 我似乎不能理解正确的语法 Delphi代码 public struct ItemFieldIdentifier { ... public static readonly string AverageMarketPrice = "AMP"; ... DIID__ItemFieldIdentifier: TGUID = '{667FB47

在Delphi7中,我试图使用COM读取一些C#.Net公共结构常量

我似乎不能理解正确的语法

Delphi代码

    public struct ItemFieldIdentifier
    {
        ...
                    public static readonly string AverageMarketPrice = "AMP";
        ...
  DIID__ItemFieldIdentifier: TGUID = '{667FB47F-6394-4ED6-842B-7581184B4138}';
  IID__ItemFieldIdentifier_2: TGUID = '{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}'
  CLASS_ItemFieldIdentifier: TGUID = '{3A9E41E3-A509-483B-A212-6A507EA29B5B}';

  _ItemFieldIdentifier = dispinterface;
  _ItemFieldIdentifier_2 = interface;
  _ItemFieldIdentifier_2Disp = dispinterface; 

    ItemFieldIdentifier = _ItemFieldIdentifier_2;

    // *********************************************************************//
    // DispIntf:  _ItemFieldIdentifier
    // Flags:     (4096) Dispatchable
    // GUID:      {667FB47F-6394-4ED6-842B-7581184B4138}
    // *********************************************************************//
  _ItemFieldIdentifier = dispinterface
    ['{667FB47F-6394-4ED6-842B-7581184B4138}']
    ...
    property AverageMarketPrice: WideString readonly dispid 45;
    ...

  end;

    // *********************************************************************//
    // Interface: _ItemFieldIdentifier_2
    // Flags:     (4432) Hidden Dual OleAutomation Dispatchable
    // GUID:      {FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}
    // *********************************************************************//
      _ItemFieldIdentifier_2 = interface(IDispatch)
        ['{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}']
      end;


    // *********************************************************************//
    // Interface: _ItemFieldIdentifier_2
    // Flags:     (4432) Hidden Dual OleAutomation Dispatchable
    // GUID:      {FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}
    // *********************************************************************//
      _ItemFieldIdentifier_2 = interface(IDispatch)
        ['{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}']
      end;

    // *********************************************************************//
    // DispIntf:  _ItemFieldIdentifier_2Disp
    // Flags:     (4432) Hidden Dual OleAutomation Dispatchable
    // GUID:      {FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}
    // *********************************************************************//
      _ItemFieldIdentifier_2Disp = dispinterface
        ['{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}']
      end;

    // *********************************************************************//
    // The Class CoItemFieldIdentifier provides a Create and CreateRemote method to          
    // create instances of the default interface _ItemFieldIdentifier_2 exposed by              
    // the CoClass ItemFieldIdentifier. The functions are intended to be used by             
    // clients wishing to automate the CoClass objects exposed by the         
    // server of this typelibrary.                                            
    // *********************************************************************//
      CoItemFieldIdentifier = class
        class function Create: _ItemFieldIdentifier_2;
        class function CreateRemote(const MachineName: string): _ItemFieldIdentifier_2;
      end;
我还没有找到任何方法来编写代码,甚至可以针对提取的TLB.pas文件进行编译。此代码无法编译,错误为:“需要对象或类”

因此,即使C#程序员告诉我这不是一个可实例化的对象,TLB也有一个这种类型的构造函数,所以我想我尝试实例化。此代码未能编译,错误为“未声明的标识符”:

我有没有办法通过COM访问这些常量,或者C#程序员是否需要创建一个我可以创建然后访问的可实例化对象

C#代码

    public struct ItemFieldIdentifier
    {
        ...
                    public static readonly string AverageMarketPrice = "AMP";
        ...
  DIID__ItemFieldIdentifier: TGUID = '{667FB47F-6394-4ED6-842B-7581184B4138}';
  IID__ItemFieldIdentifier_2: TGUID = '{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}'
  CLASS_ItemFieldIdentifier: TGUID = '{3A9E41E3-A509-483B-A212-6A507EA29B5B}';

  _ItemFieldIdentifier = dispinterface;
  _ItemFieldIdentifier_2 = interface;
  _ItemFieldIdentifier_2Disp = dispinterface; 

    ItemFieldIdentifier = _ItemFieldIdentifier_2;

    // *********************************************************************//
    // DispIntf:  _ItemFieldIdentifier
    // Flags:     (4096) Dispatchable
    // GUID:      {667FB47F-6394-4ED6-842B-7581184B4138}
    // *********************************************************************//
  _ItemFieldIdentifier = dispinterface
    ['{667FB47F-6394-4ED6-842B-7581184B4138}']
    ...
    property AverageMarketPrice: WideString readonly dispid 45;
    ...

  end;

    // *********************************************************************//
    // Interface: _ItemFieldIdentifier_2
    // Flags:     (4432) Hidden Dual OleAutomation Dispatchable
    // GUID:      {FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}
    // *********************************************************************//
      _ItemFieldIdentifier_2 = interface(IDispatch)
        ['{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}']
      end;


    // *********************************************************************//
    // Interface: _ItemFieldIdentifier_2
    // Flags:     (4432) Hidden Dual OleAutomation Dispatchable
    // GUID:      {FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}
    // *********************************************************************//
      _ItemFieldIdentifier_2 = interface(IDispatch)
        ['{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}']
      end;

    // *********************************************************************//
    // DispIntf:  _ItemFieldIdentifier_2Disp
    // Flags:     (4432) Hidden Dual OleAutomation Dispatchable
    // GUID:      {FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}
    // *********************************************************************//
      _ItemFieldIdentifier_2Disp = dispinterface
        ['{FBF4AD9B-38B5-3856-ADAC-57DB3198BBE7}']
      end;

    // *********************************************************************//
    // The Class CoItemFieldIdentifier provides a Create and CreateRemote method to          
    // create instances of the default interface _ItemFieldIdentifier_2 exposed by              
    // the CoClass ItemFieldIdentifier. The functions are intended to be used by             
    // clients wishing to automate the CoClass objects exposed by the         
    // server of this typelibrary.                                            
    // *********************************************************************//
      CoItemFieldIdentifier = class
        class function Create: _ItemFieldIdentifier_2;
        class function CreateRemote(const MachineName: string): _ItemFieldIdentifier_2;
      end;
然后,在C#中,它们有一个com互操作层

    public class ItemFieldIdentifier
    {
       public string AverageMarketPrice
       {
            get
            {
                 return xxx.Public.ItemCat.ItemFieldIdentifier.AverageMarketPrice; // <-- this is getting the value from the struct.
    }

Delphi 7不处理
vtRecord
OLE类型。此类型与C#
struct
类型匹配

我怀疑您应该使用标记为
COMVisible=True
的C#类作为数据对象,从Delphi访问

或者,您可以尝试使用较新的TLBEXP工具生成TLB.pas文件。我发现最新版本能够正确处理此类
struct
类型

因此,即使C#程序员告诉我这不是一个可实例化的对象,TLB也有一个这种类型的构造函数,所以我想我尝试实例化。此代码未能编译,错误为“未声明的标识符”

这很奇怪,因为
ItemFieldIdentifier
定义得很清楚(它是
\u ItemFieldIdentifier\u 2
的别名)

CoItemFieldIdentifier.Create()
返回一个
\u ItemFieldIdentifier\u 2
,因此您可以尝试将变量声明为该变量。但是,
\u ItemFieldIdentifier\u 2
没有声明任何成员。因此,假设
ItemFieldIdentifier_2
派生自C端的
ItemFieldIdentifier
,您可以尝试从Delphi端的
\u ItemFieldIdentifier_2
转换为
\u ItemFieldIdentifier

var
  ItemFieldIdentifier1: _ItemFieldIdentifier;
...
ItemFieldIdentifier1 := CoItemFieldIdentifier.Create as _ItemFieldIdentifier;
S := ItemFieldIdentifier1.AverageMarketPrice;  
或:


这没有多大意义。您发布的.tlb无法编译。_ItemFieldIdentifier_2的多个定义。你能再检查一下你贴的内容是否准确吗?大卫,谢谢你尝试一下。我知道发布编译过的真实代码是多么重要(特别是当我希望你能看一看的时候!:-),但是整个.pas文件太大了,无法在这里发布。我发布了一个我认为是经过有效删减的版本。不过我想不会。雷米让我走了。再次感谢。哇!很好,雷米!谢谢。如果这是解决方案,那就大错特错了。是.tlb进口商弄错了吗。如果是这样的话,我会通过修改接口声明来解决这个问题,这样代码就可以不用强制转换来编写了。我只是抱着希望尝试了一下,但没有解决问题。谢谢你的建议。
var
  ItemFieldIdentifier1: _ItemFieldIdentifier_2;
...
ItemFieldIdentifier1 := CoItemFieldIdentifier.Create;
S := (ItemFieldIdentifier1 as _ItemFieldIdentifier).AverageMarketPrice;