Это должно сработать для вас -
DECLARE @STOP_TIME DATETIME = '2016-05-10 03:31:00.000',@Start_Time DATETIME = '2016-05-10 02:25:34.000'
SELECT RIGHT('0' + CAST(DATEDIFF(S, @Start_Time, @STOP_TIME) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, @Start_Time, @STOP_TIME) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, @Start_Time, @STOP_TIME) % 60 AS VARCHAR(2)), 2)
Это не проблема .NET, это следствие того, как работает COM. Он не поддерживает наследование. Вы исправите это на стороне клиента, ему нужно вызвать QueryInterface () с IID для IBaseClass, чтобы получить указатель интерфейса на интерфейс IBaseClass, чтобы он мог вызвать GetA (). .NET interop автоматически обеспечивает реализацию QI, которая делает эту работу. Тем не менее, в этом случае он не очень удобен в использовании, разработайте свой код на C #, чтобы клиент мог легко использовать ваш класс, а не наоборот. Обычно вам нужен метод переопределения с одним слоем, который делегирует основную реализацию класса C #.
Обратите внимание, что есть проблема с сигнатурами вашего метода и использованием атрибута [PreserveSig]. Они не могут быть вызваны через IDispatch и не могут быть автоматически настроены. Для этого требуется метод с HRESULT в качестве типа возвращаемого значения. Это автоматически при удалении атрибута.
Вот другой подход, который минимизирует работу и оставляет интерфейс чистым. Просто укажите дополнительное свойство, которое возвращает BaseInterface:
public IBaseClass BaseProperties {
get { return this; }
}
Конечно, вам нужно добавить эту часть в свой интерфейс IBaseClass:
public ISingleShot BaseProperties { get; }
Вот соответствующий VB.Net Код:
ReadOnly Property BaseProperties As ISingleShot
Public ReadOnly Property BaseProperties As IBaseClass Implements IClass.BaseProperties
Get
Return Me
End Get
End Property
Это похоже очень похоже на этот вопрос: Наследование интерфейсов в классах ComVisible в C #
Как вы отметили в своем редактировании, это ограничение на .net to COM-хоп, что COM-интерфейс не содержит никаких унаследованных интерфейсов.
На некоторых языках вы могли бы решить это, внедряя блок кода во все соответствующие интерфейсы, но насколько я могу видеть это невозможно в C #.
использовать [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)] как атрибут для интерфейса, который расширяет остальные. это обходное решение.