Я создал DLL взаимодействия C# .NET 6 COM (зарегистрированную установщиком с помощью REGSVR32) для клиента интерфейса удаленного взаимодействия gRPC нашего приложения, который отлично работал в наших предыдущих выпусках продукта.
Для нашей новой версии программного обеспечения мне нужно добавить больше методов для расширения интерфейса. Однако когда я добавляю дополнительные методы, все старые методы интерфейса работают нормально, а новые выдают следующее: System.AccessViolationException: 'Попытка чтение или запись защищенной памяти. Часто это указывает на то, что другая память повреждена.
Вот исходное определение интерфейса:
Я совершенно уверен, что проблема связана с клиентским COM-сервером .NET, потому что я заметил проблемы, поэтому отказался ТОЛЬКО от дополнений COM-интерфейса, и функциональность клиент-сервер работала нормально.
Я создал DLL взаимодействия C# .NET 6 COM (зарегистрированную установщиком с помощью REGSVR32) для клиента интерфейса удаленного взаимодействия gRPC нашего приложения, который отлично работал в наших предыдущих выпусках продукта. Для нашей новой версии программного обеспечения мне нужно добавить больше методов для расширения интерфейса. Однако когда я добавляю дополнительные методы, все старые методы интерфейса работают нормально, а новые выдают следующее: [b]System.AccessViolationException: 'Попытка чтение или запись защищенной памяти. Часто это указывает на то, что другая память повреждена.[/b] Вот исходное определение интерфейса: [code] [ComVisible(true)] [Guid("9DAF4501-4AF6-43FF-95EF-C421CB43F1B8")] [InterfaceType(ComInterfaceType.InterfaceIsDual)] [System.Reflection.Obfuscation(Feature = "renaming", Exclude = true, ApplyToMembers = true)] public interface IWinCalClient5 { [DispId(1501)] bool ViewerOpen(); [DispId(1502)] bool ViewerMeasurement(bool IsCorrected, ref int[] PortList, string DataSetName, bool ReplaceExisting); [DispId(1503)] bool ViewerMeasurementStr(bool IsCorrected, string PortList, string DataSetName, bool ReplaceExisting); [DispId(1504)] bool ViewerMeasureAllPortsRaw(string DataSetName); [DispId(1505)] bool ViewerMeasureCorrected(string DataSetName); [DispId(1506)] bool ViewerLoadReport(string FullFileName); [DispId(1507)] bool ViewerListNames(out string[] DataItemNames); [DispId(1508)] bool ViewerGetDataItem(string DataItemName); [DispId(1509)] bool ViewerClose(); [DispId(1510)] bool ViewerSave(); [DispId(1511)] bool ViewerSaveAs(string NewReportName); [DispId(1512)] bool ViewerLoadData(string NewDataName); [DispId(1513)] bool ViewerSaveData(string FileName, bool Overwrite, int ComplexFormat); [DispId(1514)] bool ViewerGetStringDataItemValue(string DataItemName, out string Value); [DispId(1515)] bool ViewerGetIntDataItemValue(string DataItemName, out int Value); [DispId(1516)] bool ViewerGetBoolDataItemValue(string DataItemName, out bool Value); [DispId(1517)] bool ViewerGetRealDataItemValue(string DataItemName, out double Value); [DispId(1518)] bool ViewerSetStringDataItemValue(string DataItemName, string Value); [DispId(1519)] bool ViewerSetIntDataItemValue(string DataItemName, int Value); [DispId(1520)] bool ViewerSetBoolDataItemValue(string DataItemName, bool Value); [DispId(1521)] bool ViewerSetRealDataItemValue(string DataItemName, double Value); [DispId(1522)] bool ViewerGetComplexDataItemValue(string DataItemName, out double RealValue, out double ImaginaryValue); [DispId(1523)] bool ViewerSetComplexDataItemValue(string DataItemName, double RealValue, double ImaginaryValue);
// New methods [DispId(1700)] bool ViewerSetOnDemandPostProcessing(bool Enable); [DispId(1701)] bool ViewerGetOnDemandPostProcessing(out bool IsEnabled); [DispId(1702)] bool ViewerPerformPostProcessing(); // End New Methods } [/code] Я совершенно уверен, что проблема связана с клиентским COM-сервером .NET, потому что я заметил проблемы, поэтому отказался ТОЛЬКО от дополнений COM-интерфейса, и функциональность клиент-сервер работала нормально.