2014-05-13 13 views
5

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 đó)

+0

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. –

+0

Đó 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) –

+0

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

Trả lời

11

Tôi không thấy bất kỳ khách hàng tiềm năng có thể giải thích vấn đề này. Thuộc tính [Guid] cho các vấn đề lắp ráp, đặt ID thư viện kiểu. Và các vấn đề [AssemblyVersion], đặt số phiên bản thư viện kiểu. Các thuộc tính được khai báo trong tệp AssemblyInfo.cs của dự án. Hãy chắc chắn rằng hệ thống xây dựng của bạn không có khỉ với các thuộc tính này.

Cách tốt nhất để tìm hiểu nó là tìm hiểu chính xác những gì thay đổi. Chạy tiện ích OleView.exe từ Visual Studio Command Prompt. File + View Typelib và chọn tập tin .tlb. Sao chép/dán nội dung của bảng bên phải vào tệp văn bản.

Tạo lại dự án và lặp lại bài tập OleView. Bây giờ bạn có thể chỉ cần sử dụng một công cụ khác để xem chính xác những gì đã thay đổi. Cập nhật câu hỏi của bạn với những gì bạn phát hiện ra nếu bạn cần thêm trợ giúp.

+0

Cảm ơn bạn rất nhiều vì đã giải thích OleView.exe cho tôi. Với tiện ích này tôi đã có thể tìm ra rằng hội đồng tiếp xúc nhiều hơn tôi biết và đã tạo ra GUIDs (mà phá vỡ tài liệu tham khảo ofcourse) –

+0

@ DannyvanderKraan bạn có thể cung cấp một chút chi tiết hơn về những gì đã được tiếp xúc bất ngờ? Cảm ơn – DaveInCaz

+0

@DaveInCaz Xin lỗi, nhưng tôi đã hỏi điều này gần 3 năm trước, tôi không thể nhớ. Ý chính của nó là trong khi tôi nghĩ rằng việc xây dựng đã không thay đổi API của hội đồng của tôi, nó thực sự là. Và tôi phát hiện ra bằng phương pháp mà Hans đã mô tả ở trên. –

Các vấn đề liên quan