Возникли проблемы с добавлением новых методов на сервер взаимодействия C# .NET COM [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Возникли проблемы с добавлением новых методов на сервер взаимодействия C# .NET COM [закрыто]

Сообщение Anonymous »

Я создал DLL взаимодействия C# .NET 6 COM (зарегистрированную установщиком с помощью REGSVR32) для клиента интерфейса удаленного взаимодействия gRPC нашего приложения, который отлично работал в наших предыдущих выпусках продукта.
Для нашей новой версии программного обеспечения мне нужно добавить больше методов для расширения интерфейса. Однако когда я добавляю дополнительные методы, все старые методы интерфейса работают нормально, а новые выдают следующее:
System.AccessViolationException: 'Попытка чтение или запись защищенной памяти. Часто это указывает на то, что другая память повреждена.
Вот исходное определение интерфейса:

Код: Выделить всё

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

[DispId(1601)]
void EventWindowShow();
[DispId(1602)]
void EventWindowAddMsg(string TheMsg);
[DispId(1603)]
void EventWindowHide();
[DispId(1604)]
void EventWindowAddMsg(string TheMsg, bool ForceShow);
}
Вот определение НОВОГО интерфейса с тремя новыми методами:

Код: Выделить всё

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

[DispId(1601)]
void EventWindowShow();
[DispId(1602)]
void EventWindowAddMsg(string TheMsg);
[DispId(1603)]
void EventWindowHide();
[DispId(1604)]
void EventWindowAddMsg(string TheMsg, bool ForceShow);

// New methods
[DispId(1700)]
bool ViewerSetOnDemandPostProcessing(bool Enable);
[DispId(1701)]
bool ViewerGetOnDemandPostProcessing(out bool IsEnabled);
[DispId(1702)]
bool ViewerPerformPostProcessing();
// End New Methods
}
Я совершенно уверен, что проблема связана с клиентским COM-сервером .NET, потому что я заметил проблемы, поэтому отказался ТОЛЬКО от дополнений COM-интерфейса, и функциональность клиент-сервер работала нормально.

Подробнее здесь: https://stackoverflow.com/questions/787 ... rop-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»