Привет.
Есть 1С-addin, писанный на шарпе.
Все замечательно работает кроме одного момента — хочу перехватить .NET-исключение и передать его в 1С для того, чтобы остановить выполнение 1С-ного модуля ну и отобразить исключение в окне сообщений. Для этого использую IErrorLog, который прекрасно работает в неуправляемых addin'ах:
[Guid("3127CA40-446E-11CE-8135-00AA004BB851")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IErrorLog
{
void AddError(String pszPropName, System.Runtime.InteropServices.ComTypes.EXCEPINFO pExepInfo);
}
public void Init(Object connection)
{
Connection = connection;
ErrorLog = (IErrorLog)Connection;
}
protected void PostException(Exception ex)
{
if (ErrorLog == null)
return;
var info = new EXCEPINFO
{
wCode = 1006,
bstrDescription = String.Format(_addinError, ex.GetType(), ex.Message, ex.StackTrace),
bstrSource = AddInName,
scode = 1
};
ErrorLog.AddError("", info);
}
На вызове ErrorLog.AddError получаю AccessViolation, 1С это спокойно проглатывает и радостно работает дальше.
Более того, если просто выбросить в .NET-коде необработанное исключение, 1С пофигу, хотя даже б-гмерзкий Delphi в этом случае падает с OLE-шным исключением.
Проверял на версиях платформы 7.7 и 8.2.
Перепробовал все распостранненые в интернетах примеры 1С-ных addin'ов, определений IErrorLog и структуры EXCEPINFO. Результат один и тот же.
На GDN'не нашелся один счастливец, столкнувшийся с этой проблемой, решивший ее и запостивший исходник с решением на сервер, откуда его уже благополучно удалили.
Какие есть идеи?