我有一个用Delphi 7编写的遗留应用程序。我们正在向应用程序添加新模块。这些模块是用Visual Studio 2010,.NET 4,C#编写的,并通过COM公开给应用程序。如何将Delphi的.NET COM对象的实例传递给另一个.NET COM对象?
我成功地定义了一个类,注册了程序集,导出了类型库,将类型库导入到Delphi中,在Delphi中创建了COM客户端并执行了该模块。现在出现了棘手的部分:我想通过另一个对象(已被定义 - 注册 - 输出 - 等等 - 等等 - 如上所述)作为第一个模块上的方法的参数。
.NET
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("11111111-1111-1111-1111-AAAAAAAAAAAA")]
public interface IUserMaintenance
{
bool AssignUser(IUserInfo);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("11111111-1111-1111-1111-BBBBBBBBBBBB")]
public class UserMaintenance: IUserMaintenance
{
private IUserInfo _UserInfo;
public bool AssignUser(IUserInfo userInfo)
{
_UserInfo = userInfo;
LoadUser();
}
private void LoadUser()
{
//load user data from database using _UserInfo.UserName
}
}
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("22222222-2222-2222-2222-AAAAAAAAAAAA")]
public interface IUserInfo
{
void Initialize(string userName);
string UserName { get; }
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("22222222-2222-2222-2222-BBBBBBBBBBBB")]
public class UserInfo: IUserInfo
{
public string UserName { get; private set };
public void Initialize(string userName)
{
UserName = userName;
}
}
假设我有实现每个接口独立的类,和含有这些类的组件编译和注册成功,我导入类型库导入Delphi创建UserMaintenance_TLB.pas和UserInfo_TLB。 PAS。但是,我发现一些未被检测到的东西:虽然我在.NET中定义的接口存在(以“I”开头的接口),但Delphi生成了另一组接口(以“_”开头)。德尔福确实而不是使用我在.NET中声明的I接口。
德尔福
UserMaintenance_TLB.pas
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
IUserMaintenance = interface;
IUserMaintenanceDisp = dispinterface;
_UserMaintenance = interface;
_UserMaintenanceDisp = dispinterface;
UserInfo_TLB.pas
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
IUserInfo = interface;
IUserInfoDisp = dispinterface;
_UserInfo = interface;
_UserInfoDisp = dispinterface;
德尔福也创造了相应的德尔福类型:
// *********************************************************************//
// OLE Server Proxy class declaration
// Server Object : TUserMaintenance
// Help String :
// Default Interface: _UserMaintenance
// Def. Intf. DISP? : No
// Event Interface:
// TypeFlags : (2) CanCreate
// *********************************************************************//
TUserMaintenance = class(TOleServer)
private
FIntf: _UserMaintenance;
function GetDefaultInterface: _UserMaintenance;
protected
procedure InitServerData; override;
function Get_ToString: WideString;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Connect; override;
procedure ConnectTo(svrIntf: _UserMaintenance);
procedure Disconnect; override;
function Equals(obj: OleVariant): WordBool;
function GetHashCode: Integer;
function GetType: _Type;
WordBool AssignUser(IUserInfo userInfo);
property DefaultInterface: _UserMaintenance read GetDefaultInterface;
property ToString: WideString read Get_ToString;
published
end;
我想要做的就是创建TUserMaintenance的一个实例,然后通过TUserInfo的实例到它。然而,有两点很明显:Delphi类TUserInfo不实现IUserInfo,而DefaultInterface是Delphi生成的新接口_UserInfo。我无法将我的UserInfo变量声明为IUserInfo类型,因为TUserInfo没有实现该接口。我也不能将它声明为_UserInfo类型,因为UserMaintenance.LoadUser需要一个IUserInfo实例。
无可否认,这是我的实际问题的一个简单的例子,但我认为它足以说明问题。
所以我的问题是这样的:有什么办法让我强制Delphi中的接口类型保持与在.NET中声明的接口一致?或者有另一个我可以将UserInfo的实例传递给UserMaintenance的方法?