c#.net . COM dll与vb6应用程序中断引用

本文关键字:应用程序 中断 引用 vb6 net COM dll | 更新日期: 2023-09-27 18:03:10

我有一个用c#编写的DLL。它公开了一个COM接口,所以vb6应用程序可以调用我的DLL。这个接口看起来像:

   [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);
            }
        }

    }

这很好。但是每次我在不改变接口的情况下构建这个DLL时(因为我必须在逻辑的某个地方修复一些东西),vb6应用程序的引用被破坏了,我们需要重新编译vb6应用程序。

有人知道我做错了什么吗?因为我们有vb.net DLL在重新编译后由于固定的guid而没有破坏引用。如有任何帮助,不胜感激。

vb6应用程序和DLL都是可操作的。但是当我重新编译DLL并通过vb6应用程序在我们的测试服务器上测试它时,我得到一个自动化错误(这通常意味着引用被破坏,您需要重新编译vb6应用程序)

c#.net . COM dll与vb6应用程序中断引用

我没有看到任何强有力的线索可以解释这个问题。程序集的[Guid]属性很重要,它设置了类型库ID。[AssemblyVersion]很重要,它设置了类型库的版本号。这些属性在项目的AssemblyInfo.cs文件中声明。确保你的构建系统不会与这些属性混淆。

最好的方法是找出到底是什么改变了。从Visual Studio命令提示符运行OleView.exe实用程序。File + View Typelib并选择.tlb文件。将右面板的内容复制/粘贴到文本文件中。

重新构建项目并重复OleView练习。现在,您可以简单地使用差分工具来查看究竟发生了什么变化。

如果你需要更多的帮助,把你发现的问题更新一下。