Твой код появился в этой теме, после поиска проблемы. Мой код был доработан в это же время.
теперь понял. я сначала подумал, что это решение и так было тобой найдено ранее, но чем-то тебя не устроило и ты создал тему.
Обсуждение паттернов в разрезе кто, что и как написал, и насколько понятно/непонятно, предлагаю тут не вести.
Тогда предлагаю их тут и не упоминать, тем самым внося некоторые неясности.
Дважды в один и тот же AppDomain загрузить одну и ту же Assembly невозможно. Соответственно и регистрация событий будет выполнена лишь единожды, при первой (и ей же последней) загрузке управляемой сборки.
Кстати, здесь есть одно НО... Дело в том, что
CLR реализована в виде COM сервера. Если мне не изменяет память, то начиная с .NET 4.5
неуправляемое приложение может использовать в своей работе сразу несколько таких COM серверов - по одному для каждой поддерживаемой приложением версии CLR. Это позволяет успешно загружать в исходное неуправляемое приложение написанные для него управляемые плагины, скомпилированные под разные версии .NET: 3.5, 4.0, 4.5, 4.5.1. Каждый плагин грузится в соответствующий ему COM сервер (CLR).
Т.е. если новые версии AutoCAD будут пользоваться такой возможностью, то AutoCAD в разные CLR сможет загрузить две идентичные сборки, отличающиеся лишь тем, что они откомпилированы под разные версии .NET.
В этом случае может получится что у одного и того же (по сути) кода на одно и то же событие происходит регистрация несколько раз (по разу в каждой CLR).
Ещё один момент: один и тот же код может быть скомпилирован под
разные версии .NET, использующие одну и ту же версию CLR. Что произойдёт, если юзер попытается загрузить в акад обе сборки? Это опасный случай... Давай посмотрим его на примере этого кода. Во вложении zip файл с результатом пакетной компиляции одного и того же исходного кода под разные версии акадов. В качестве примера буду использовать AutoCAD 2016.
В обозначенную версию AutoCAD можно успешно загрузить как DWG_save_sandbox.R20.0.dll, так и DWG_save_sandbox.R20.1.dll. Первую я откомпилировал как .NET 4.5, а вторую как .NET 4.5.1. Каждая из них работает корректно. НО... После загрузки DWG_save_sandbox.R20.1.dll ты можешь загрузить и DWG_save_sandbox.R20.0.dll (именно в этом порядке). Поскольку фактически это две разные сборки, то ты можешь загрузить и вторую из них... Вот тут и начинается бардак... В консоли автокада ты увидишь сообщение об успешной загрузке (т.е. сборка была успешно загружена, метод Initialize найден и успешно выполнен). Следующим сообщением является сообщение об ошибке.
А вот теперь... Если ты нажмёшь Ctrl + S, то автокад впадёт в тот самый бесконечный цикл о котором я писал ранее и зависнет. В проводнике ты будешь видеть, как массово появляются очередные бэкапы...
Так что на самом деле не всё так гладко в данном вопросе, как хотелось бы...