Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用用户定义的类型对象创建SafeArray_C#_.net_Delphi_Interop - Fatal编程技术网

C# 使用用户定义的类型对象创建SafeArray

C# 使用用户定义的类型对象创建SafeArray,c#,.net,delphi,interop,C#,.net,Delphi,Interop,我正在使用Delphi和c#之间的互操作性概念。我在c#中创建了类,并将这些类作为com对象导入delphi项目。 c#代码中的类声明 当我将这个类作为com对象导入delphi时 IHotelAvailNotifRQ = interface(IDispatch) ['{2F7C57D7-256A-3102-A4C6-FD081C8342B4}'] function Get_AvailStatusMessages: PSafeArray; safecall; procedure Se

我正在使用Delphi和c#之间的互操作性概念。我在c#中创建了类,并将这些类作为com对象导入delphi项目。 c#代码中的类声明

当我将这个类作为com对象导入delphi时

IHotelAvailNotifRQ = interface(IDispatch)
  ['{2F7C57D7-256A-3102-A4C6-FD081C8342B4}']
  function Get_AvailStatusMessages: PSafeArray; safecall;
  procedure Set_AvailStatusMessages(pRetVal: PSafeArray); safecall;
  property AvailStatusMessages: PSafeArray read Get_AvailStatusMessages  write Set_AvailStatusMessages;
end;
我可以成功创建IAvailStatusMessage对象。但是,当我使用函数将这个对象放入数组时

SafeArrayPutElement(HotelAvailNotifRQ.AvailStatusMessages, Idx, AvailStatusMessage)

我得到的错误类似于“参数不正确”。请帮我解决这个问题。

经过一天的努力,终于找到了解决问题的办法。将双方代码更改为后

Delphi端码

var
  varAvailStatusMessages : Variant;
begin
    varAvailStatusMessages := VarArrayCreate([0, AvailStatusMessages.Count], varDispatch);
    varAvailStatusMessages[asmIdx] := AvailStatusMessage;
    Result.AvailStatusMessages := PSafeArray(TVarData(varAvailStatusMessages).VArray);
end;
public class HotelAvailNotifRQ : IHotelAvailNotifRQ
{
   [MarshalAs(UnmanagedType.Interface)]
   public IAvailStatusMessage[] AvailStatusMessagesField;

   public IAvailStatusMessage[] AvailStatusMessages
   {
    get { return AvailStatusMessagesField; }
    set { AvailStatusMessagesField = value; }
   }
}
.Net端码

var
  varAvailStatusMessages : Variant;
begin
    varAvailStatusMessages := VarArrayCreate([0, AvailStatusMessages.Count], varDispatch);
    varAvailStatusMessages[asmIdx] := AvailStatusMessage;
    Result.AvailStatusMessages := PSafeArray(TVarData(varAvailStatusMessages).VArray);
end;
public class HotelAvailNotifRQ : IHotelAvailNotifRQ
{
   [MarshalAs(UnmanagedType.Interface)]
   public IAvailStatusMessage[] AvailStatusMessagesField;

   public IAvailStatusMessage[] AvailStatusMessages
   {
    get { return AvailStatusMessagesField; }
    set { AvailStatusMessagesField = value; }
   }
}
谢谢你的推荐,

为什么要使用LPArray类型?恐怕您无法通过COM访问IAvailStatusMessage接口实例。在两者之间使用一个普通的.Net类来封装接口,然后发布一个常规列表。嗨,Arnaud,我认为根据COM对象,我们只能发布接口。我没有对此进行测试。还有,是否可以将列表从托管代码发布到非托管代码?如果可能的话,它将很容易解决我的问题。如果您有任何参考链接,请将其发送。
Idx
-此参数的类型是什么?其整数类型的参数。我用一维整数数组进行了测试。如果
idx
是整数,请尝试
SafeArrayPutElement(HotelAvailNotifRQ.AvailStatusMessages,@idx,AvailStatusMessages)