[英]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.