Tôi có một DLL viết bằng C# .NET mà lộ ra một giao diện COM, do đó, một ứng dụng VB6 có thể gọi DLL của tôi. Giao diện này trông giống như:C# .net COM phá vỡ dll tham khảo với ứng dụng vb6
[System.Runtime.InteropServices.Guid("3D2C106C-097F-4ED7-9E4F-CDBC6A43BDC4")]
public interface IZDPharmaManager {
[System.Runtime.InteropServices.DispId(2)]
SearchPatientEventArgs FoundPatient { get; set; }
[System.Runtime.InteropServices.DispId(3)]
IntPtr Start(string server, string database, string user, string password, bool integrated, int praktijkID, string userGUID, int userID, string userName, bool hasRightToSearchPatient);
[System.Runtime.InteropServices.DispId(4)]
void Stop();
[System.Runtime.InteropServices.DispId(5)]
void InitializeSkinner(System.Object skinnerFramework);
}
[System.Runtime.InteropServices.Guid("4438852E-CF2D-4DB0-8E6E-428F65A6B16C")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IZDPharmaManagerEvents {
[DispId(1)]
void SearchPatient(ZDPharmaManager sender, SearchPatientEventArgs e);
}
[System.Runtime.InteropServices.Guid("9297D43F-C581-3F0F-AA60-9506C6B77B5F")]
[ClassInterface(ClassInterfaceType.None)]
public class SearchPatientEventArgs : WebHIS.ZDPharmaceutisch.ISearchPatientEventArgs {
public SearchPatientEventArgs() {
//Nodig voor COM.
}
public int ID { get; set; }
public string FullName { get; set; }
public string OwnName { get; set; }
public string PartnerName { get; set; }
public string DateOfBirth { get; set; }
public string ZipCode { get; set; }
public string HouseNumber { get; set; }
public string BSN { get; set; }
}
public delegate void SearchPatientEventHandler(ZDPharmaManager sender, SearchPatientEventArgs e);
[System.Runtime.InteropServices.Guid("465AC7EC-27EF-3D95-AAA6-29D01FCF15A1")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IZDPharmaManagerEvents))]
public class ZDPharmaManager : WebHIS.ZDPharmaceutisch.IZDPharmaManager {
public event SearchPatientEventHandler SearchPatient = null;
public SearchPatientEventArgs FoundPatient { get; set; }
//private MainForm GraphicalInterface { get; set; }
private ChoosePatient GraphicalInterface { get; set; }
public ZDPharmaManager() {
//Nodig voor COM.
}
#region IZDPharmaManager Members
public IntPtr Start(string server,
string database,
string user,
string password,
bool integrated,
int praktijkID,
string userGUID,
int userID,
string userName,
bool hasRightToSearchPatient) {
//Zet connectiestring.
DAL.DAC.CnnInfo = new System.Data.SqlClient.SqlConnectionStringBuilder() {
DataSource = server,
InitialCatalog = database,
UserID = user,
Password = password,
IntegratedSecurity = integrated
};
DAL.DAC.PracticeID = praktijkID;
DAL.DAC.UserGUID = userGUID;
DAL.DAC.UserID = userID;
DAL.DAC.UserName = userName;
DAL.DAC.HasRightToSearchPatient = hasRightToSearchPatient;
//Apotheek IDs ophalen en bewaren.
DAL.DAC.PharmacyIDs = DAL.PracticeDAO.GetPharmacyByPracticeID(praktijkID);
//Initialiseer grafische interface.
//this.GraphicalInterface = new MainForm();
this.GraphicalInterface = new ChoosePatient();
//Haal ongekoppelde afhaalberichten op.
this.GraphicalInterface.Patients = new VML.PatientsVM(this);
//Toon grafische interface.
this.GraphicalInterface.Show();
return this.GraphicalInterface.Handle;
}
public void Stop() {
foreach (var item in this.SearchPatient.GetInvocationList()) {
this.SearchPatient -= (SearchPatientEventHandler)item;
}
this.GraphicalInterface.Close();
this.GraphicalInterface = null;
this.FoundPatient = null;
}
public void InitializeSkinner(System.Object skinnerFramework) {
WebHIS.ZDPharmaceutisch.SkinnerModule.SkinFramework = (XtremeSkinFramework.SkinFramework)skinnerFramework;
}
#endregion
internal virtual void OnSearchPatient(SearchPatientEventArgs e) {
if (this.SearchPatient != null) {
this.SearchPatient(this, e);
}
}
}
Điều này làm việc tốt. Nhưng mỗi khi tôi xây dựng DLL này mà không thay đổi giao diện (bởi vì tôi phải sửa một cái gì đó ở đâu đó trong logic), tham chiếu với ứng dụng vb6 bị hỏng và chúng ta cần biên dịch lại ứng dụng vb6.
Có ai biết tôi đang làm gì sai không? Bởi vì chúng tôi đã có vb.net DLL mà không phá vỡ các tài liệu tham khảo sau khi biên dịch lại do GUIDs cố định. Bất kì sự trợ giúp nào đều được đánh giá cao.
Cập nhật Cả ứng dụng vb6 và DLL đều hoạt động. Nhưng khi tôi biên dịch lại tệp DLL và kiểm tra nó trên trình kiểm tra của chúng tôi thông qua ứng dụng vb6, tôi nhận được lỗi tự động hóa (thường có nghĩa là tham chiếu bị hỏng và bạn cần biên dịch lại ứng dụng vb6 đó)
im không khá chắc chắn những gì bạn có ý nghĩa nhưng nếu bạn có kèm theo các tài liệu tham khảo và bây giờ bạn đang làm thay đổi dll của bạn, bạn cần phải có ít nhất đóng VB6 hoặc miễn phí tài liệu tham khảo cho bạn dll sau mỗi lần biên soạn các dll của bạn. –
Đó thực sự không phải là ý tôi. Cả ứng dụng vb6 và DLL đều hoạt động. Nhưng khi tôi biên dịch lại DLL và kiểm tra nó trên trình kiểm tra của chúng tôi thông qua ứng dụng vb6, tôi nhận được lỗi tự động hóa (thường có nghĩa là tham chiếu bị hỏng và bạn cần biên dịch lại ứng dụng vb6) –
Các lớp công cộng khác trong DLL của bạn có thể tự động nhận UUID/GUID thay đổi khi bạn biên dịch lại. Có vẻ như điều đó đã xảy ra trong một ví dụ tôi đã thấy gần đây. – DaveInCaz