Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Непонятная проблема с .NET и COM


Автор: DragonFire 5.7.2009, 15:16
День добрый всем.

Итак пишу COM сервер, который обрабатывает некие сообщения, поступающие от внешнего приложения. 
Есть два интерфейса (примеры немного упрощены здесь и далее):
Код

    [GuidAttribute("тут гуид")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ICallBack
    {
        void MyEvent(string Info);
        void RegisterEvent(IEvents MyEvents);
    }

    public interface IEvents
    {
        void MyEvent(string Info);
    }

И два класса, что реализуют эти интерфейсы:
Код

    [EventTrackingEnabledAttribute(true)]
    [Guid("тут гуид")]
    [ClassInterface(ClassInterfaceType.None)]
    public class MyCallBack : ServicedComponent, ICallBack
    {
        private IEvents _Events;
        public void RegisterEvent(IEvents MyEvents)
        {
            _Events = MyEvents; 
        }
        public void MyEvent(String Info)
        {
            _Events.MyEvent(Info);
        }
    }

    public class MyEvents : IEvents
    {
        public void MyEvent(string Info)
        {
            System.Windows.Forms.MessageBox.Show(Info);
        }
    }

Все это лежит в одной сборке, которая зарегана в системе. Далее в основной программе пишем такой код:
Код

     MyCallBack _CallBack = new MyCallBack();
     MyEvents _Events = new MyEvents();
     _CallBack.RegisterEvent(_Events);            

На строке _CallBack.RegisterEvent(_Events) на этапе выполнения вылазит ошибка что класс MyEvents не помечен как сериализуемый. 
Тогда помечаем его атрибутом [Serializable()]. После этого на той же стрке вылазит ошибка 
System.Runtime.Serialization.SerializationException was unhandled
Message="Unable to find assembly"


Я не понимаю как такое может быть, если оба класса MyEvents и MyCallBack лежат в одной сборке. Причем как СОМ - сервер она прекрасно работает и обрабатывает все запросы. 

Заранее спасибо!

Автор: DragonFire 6.7.2009, 09:16
Отвечаю сам себе smile
Необходимо было зарегестрировать COM сборку в GAC и после этого в реестре, вот так:
Код

"C:\Program Files\Microsoft.NET\SDK\v2.0\Bin\gacutil" /i MyCallBack.dll
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm" MyCallBack.dll
pause

После этого залезть в диспетчер задач и учить dllhost.exe - все что запущены (обычно их два - от имени System и от пользователя).
Теперь при запуске приложения все работает.

Может кому-нибудь пригодиться...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)