簡體   English   中英

使用COM實例化C ++中的C#類成員

[英]Instantiating C# Class Members in C++ using COM

我想在C ++中創建一個C#類對象並設置其成員字段。 盡管我能夠創建C ++類對象,但無法訪問其成員並設置成員字段值。

/// <summary>
/// Class for AQS Entity
/// </summary>
[ClassInterface(ClassInterfaceType.None)]
[Guid("70F12A44-B91D-474D-BD70-32B1ACE041D6")]
[ProgId("AQSEntity")]
public class AQSEntity : IEntity
{

    public AQSEntity()
    {
        sRecoveryDBName = String.Empty;
        arrSourceMailboxesEntity = null;
        sQueryString = String.Empty;
    }

    [MarshalAs(UnmanagedType.BStr)]
    public string sRecoveryDBName = string.Empty;

    [MarshalAs(UnmanagedType.ByValArray)]
    public MailBoxCollection arrSourceMailboxesEntity;

    [MarshalAs(UnmanagedType.BStr)]
    public string sQueryString;


}

IEntity類在下面定義

[Guid("5C71057E-9FD9-47D5-B022-8D5F9C7007D3")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IEntity
{
}

在C ++中,

IEntity* pTest1 = NULL;
hr = CoCreateInstance(__uuidof(**AQSEntity**),NULL,CLSCTX_INPROC_SERVER,__uuidof(IEntity),(void**)&pTest1);

我想在C ++中訪問AQSEntity類的成員。 但是我無法訪問它們。

pTest1-> sQueryString

給出錯誤。

'sQueryString':不是'AsigraExchange :: IEntity'的成員C:\\ PROJECTS \\ COM \\ COMClient \\ COMClient.cpp 168

誰能建議我錯了。

謝謝,甘根

一切都按照應有的方式表現:)

在C ++項目中,允許您訪問在IEntity接口上聲明的所有方法,沒有方法。

您的實現(即AQSEntity類)應實現所有IEntity成員。 現在在該類中聲明的方法是該類的成員, IEntity它們都不與IEntity相關。

這意味着您需要在IEntity接口中聲明所有必需的方法,然后在AQSEntity實現它們。 請注意,您還將公開類的字段,而不是方法。 您將必須定義方法(或屬性,這些屬性將轉換為C ++方面的方法),然后實現它們。 就像是:

public interface IEntity
{
    public string RecoveryDBName { get; }
}

您還必須在接口中指定[MarshalAs]屬性,盡管字符串默認情況下是UnmanagedType.BStr ,所以可以忽略它們。

編輯:

基於注釋,似乎IEntity只是一個標記接口,不打算作為API公開(此處屬性可能是更好的選擇,因為IEntity都不會在客戶端使用IEntity )。

在這種情況下,有兩種選擇:

1)更好的方法,盡管需要更多工作:從IEntity派生IAQSEntity接口,在其上聲明方法,並在AQSEntity類上實現

2)減少工作量,但變得更脆弱:將AQSEntity標記為ClassInterfaceType.AutoDual而不是ClassInterfaceType.None這會將成員公開給COM客戶端,但是版本難得多,並且還將公開基本類型成員。

這是我會選擇的:

[ClassInterface(ClassInterfaceType.None)]
...
[Entity]  // instead of IEntity marker interface
public class AQSEntity : IAQSEntity
{
    public string RecoveryDbName { get; }
}

[Guid("...")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IAQSEntity // no base interface IEntity!
{
    string RecoveryDbName { get; }        
}

使用Entity屬性而不是IEntity標記接口的唯一缺點是是否要使用該接口作為泛型的約束

您的界面確實不包含任何成員。 您需要將成員放入接口,然后在您的類中實現該接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM