gpt4 book ai didi

c# - 将对象数组从 C# 返回到 COM 中的 C

转载 作者:太空狗 更新时间:2023-10-29 20:43:07 25 4
gpt4 key购买 nike

我正在使用 COM 在 C++ 和 C# 之间进行通信。

我在 C# 中有以下类

  1. 电子邮件地址

    /// <summary>
    /// Email Address
    /// </summary>
    public class EmailAddress
    {
    /// <summary>
    /// SMTP Address
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Address;

    /// <summary>
    /// Name
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Name;
    }
  2. 邮箱

    /// <summary>
    /// MailBox Entity
    /// </summary>
    public struct MailBoxEntity
    {
    /// <summary>
    /// SMTP Address
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string SMTPAddress;

    /// <summary>
    /// Mailbox Display Name
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Name;

    /// <summary>
    /// Mailbox Server Name
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string sServerName;
    }
  3. EmailEntity(尚未实现 IEmailEntity,它将包含每个字段的属性)

    /// <summary>
    /// Class for Email Entity
    /// </summary>
    public class EmailEntity : IEmailEntity
    {
    /// <summary>
    /// BccRecipients
    /// </summary>
    [MarshalAs(UnmanagedType.ByValArray)]
    public EmailAddress[] BccRecipients;

    /// <summary>
    /// Body
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Body;

    /// <summary>
    /// CcRecipients
    /// </summary>
    [MarshalAs(UnmanagedType.ByValArray)]
    public EmailAddress[] CcRecipients;

    /// <summary>
    /// Culture
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Culture;

    /// <summary>
    /// DateTimeCreated
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string DateTimeCreated;

    /// <summary>
    /// DateTimeReceived
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string DateTimeReceived;

    /// <summary>
    /// DateTimeSent
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string DateTimeSent;

    /// <summary>
    /// FromAddress
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string FromAddress;

    /// <summary>
    /// FromName
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string FromName;


    /// <summary>
    /// HasAttachments
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string HasAttachments;

    /// <summary>
    /// Id
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Id;

    /// <summary>
    /// Importance
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Importance;

    /// <summary>
    /// LastModifiedName
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string LastModifiedName;

    /// <summary>
    /// LastModifiedTime
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string LastModifiedTime;

    /// <summary>
    /// MimeContent
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string MimeContent;

    /// <summary>
    /// ParentFolderId
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string ParentFolderId;

    /// <summary>
    /// Original Mailbox
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public MailBoxEntity OriginalMailBox;


    /// <summary>
    /// ParentFolderName
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string ParentFolderName;

    /// <summary>
    /// ReceivedByAddress
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string ReceivedByAddress;

    /// <summary>
    /// ReceivedByName
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string ReceivedByName;

    /// <summary>
    /// Size
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Size;

    /// <summary>
    /// Subject
    /// </summary>
    [MarshalAs(UnmanagedType.BStr)]
    public string Subject;

    /// <summary>
    /// ToRecipients
    /// </summary>
    [MarshalAs(UnmanagedType.ByValArray)]
    public EmailAddress[] ToRecipients;

    }

如何访问从 C# 中的函数返回的 EmailEnity 对象数组(在 C++ 中)并阅读 EmailEntity 类的字段。请注意,EmailEntity 类包含如下成员EmailAddress[] 本身就是一个对象数组。我正计划实现接口(interface) IEmailEntity,其中包含用于访问 EmailEntity 字段的属性并使用它来访问 C++ 中的字段。这是正确的方法吗?

如何在 C++ 中访问复杂的字段成员,例如 EmailAddress (EmailAddress[] ToRecipients) 数组。

请提出建议。

谢谢

最佳答案

您可以像这样简化 .NET 代码(删除所有应自动完成的 MarshalAs):

[ComVisible(true)]
public class MyRootClass : IMyRootClass // some class to start with
{
public IEmailEntity[] GetEntities()
{
List<IEmailEntity> list = new List<IEmailEntity>();
for(int i = 0; i < 10; i++)
{
EmailEntity entity = new EmailEntity();
List<IEmailAddress> addresses = new List<IEmailAddress>();
addresses.Add(new EmailAddress { Name = "Joe" + i });
entity.BccRecipients = addresses.ToArray();
entity.Body = "hello world " + i;
list.Add(entity);
}
return list.ToArray();
}
}

[ComVisible(true)]
public interface IMyRootClass
{
IEmailEntity[] GetEntities();
}

public class EmailEntity : IEmailEntity
{
public IEmailAddress[] BccRecipients { get; set; }
public string Body { get; set; }
}

public class EmailAddress : IEmailAddress
{
public string Address { get; set; }
public string Name { get; set; }
}

[ComVisible(true)]
public interface IEmailAddress
{
string Address { get; set; }
string Name { get; set; }
}

[ComVisible(true)]
public interface IEmailEntity
{
IEmailAddress[] BccRecipients { get; set; }
string Body { get; set; }
// to be continued...
}

要将它与 C++ 一起使用,您需要注册 DLL 并构建一个 .TLB(类型库文件),如此处类似答案中所述:Implement a C# DLL COM File In Unmanaged C++ Program

然后,您可以在 C++ 中访问这些类,如下所示:

#include "stdafx.h"
#import "c:\MyPathToTheTlb\YourAssembly.tlb" // import the COM TLB

using namespace YourAssembly;

int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
IMyRootClassPtr ptr(__uuidof(MyRootClass));
CComSafeArray<IUnknown*> entities = ptr->GetEntities(); // CComSafeArray needs atlsafe.h in the PCH
for(int i = entities.GetLowerBound(0); i <= entities.GetUpperBound(0); i++)
{
IEmailEntityPtr entity;
entities.GetAt(i).QueryInterface(&entity);
_bstr_t body = entity->Body;
printf("%S\n", body.GetBSTR());

CComSafeArray<IUnknown*> recipients = entity->BccRecipients;
for(int j = recipients.GetLowerBound(0); j <= recipients.GetUpperBound(0); j++)
{
IEmailAddressPtr address;
recipients.GetAt(j).QueryInterface(&address);
_bstr_t name = address->Name;
printf(" %S\n", name.GetBSTR());
}
}
CoUninitialize();
}

关于c# - 将对象数组从 C# 返回到 COM 中的 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16293994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com