powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Activator.CreateInstance и Remoting
13 сообщений из 13, страница 1 из 1
Activator.CreateInstance и Remoting
    #34751707
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос к знатокам ремоутинга.
Имеем сервер и клиент, модель CAO (client activation). Активация на клиенте выполняется следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
object[] fAttrs = {new UrlAttribute(URL(host, port))};
ObjectHandle hObj = Activator.CreateInstance("MyAssemblyName", "MyNamespace.MyServerObjType", 
  true, BindingFlags.Instance | BindingFlags.Public, null, null, null, fAttrs, null);
IMyObjInterface obj = hObj.Unwrap() as IMyObjInterface;
obj.SomeProc(...);
...

На сервере имеется собственно exe сервера и сборка, в которой выполняется регистрация (сборка является плугином и подгружается динамически при старте сервера, а лежит она в поддиректории Plugins директории, из которой запускается сервер):
Код: plaintext
1.
RemotingConfiguration.RegisterActivatedServiceType(typeof(MyServerObjType));

При попытке активации с клиента Activator.CreateInstance выдает следующую ошибку:
Код: plaintext
1.
Cannot load type 'MyNamespace.MyServerObjType, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
StackTrace такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Server stack trace: 
   at System.Runtime.Remoting.Activation.ActivationListener.Activate(IConstructionCallMessage ctorMsg)
   at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] 
args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle 
md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 
methodPtr, Boolean fExecuteInContext)

Если сборку с серверным классом положить в папку с exe-файлом, то все работает.
Вопрос в том, что надо подкрутить в ремоутинге, чтобы он находил нужную сборку на сервере в той папке, в которой я хочу, чтобы она лежала?
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34751768
Слима
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Activator.CreateInstanceFrom
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34751795
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СлимаActivator.CreateInstanceFrom
Не подходит - клиент о том, где на сервере чего лежит, вообще ничего знать не должен.
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34751887
CodeMonkey94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MyNamespace.MyServerObjType должен быть и на сервере и на клиенте, при чём сборка должна быть одной и той же версии и там и там.
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34751915
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CodeMonkey94MyNamespace.MyServerObjType должен быть и на сервере и на клиенте, при чём сборка должна быть одной и той же версии и там и там.
Так и есть. Только на клиенте можно просто заглушку сделать - серверную сборку тащить не обязательно. Вопрос-то в другом.
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34751983
CodeMonkey94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может попробовать написать конфигурационный файл основного приложения, в котором указать <probing privatePath="plugins" />?
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34751990
CodeMonkey94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, файл MainApplication.exe.config с таким содержимым:

<?xml version="1.0"?>
<configuration>
<runtime>
<gcConcurrent enabled="true" />
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<publisherPolicy apply="yes" />
<probing privatePath="plugins" />
</assemblyBinding>
</runtime>
</configuration>

положить в папку с MainApplication.exe
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34752019
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Оно ) Так работает.
Правда, все-равно остается непонятным, почему рантайм не может автоматически найти нужную сборку, ведь на этапе регистрации серверного класса я явно указываю его тип, а раз известен тип - стало быть известно и где он находится, разве не так?
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34752040
CodeMonkey94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не так. Программа будет обращаться к типу, находящемуся в сборке, нахождение которой неизвестно. Среда CLR не будет зондировать все подкаталоги проекта, если не попросить её об этом через конфигурационный файл.
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34752047
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CodeMonkey94Не так. Программа будет обращаться к типу, находящемуся в сборке, нахождение которой неизвестно. Среда CLR не будет зондировать все подкаталоги проекта, если не попросить её об этом через конфигурационный файл.Почему неизвестно? Вот ты скажи: когда я вызываю RegisterActivatedServiceType и передаю туда тип сервиса, рантайм знает, где этот тип находится?
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34752079
CodeMonkey94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dedushka MazaiПочему неизвестно? Вот ты скажи: когда я вызываю RegisterActivatedServiceType и передаю туда тип сервиса, рантайм знает, где этот тип находится?

Да, знает, ибо этот тип находится на клиенте и клиент знает, в какой сборке находится этот тип. С другой стороны серверная программа (основной exe) не знает, где находится его "MyNamespace.MyServerObjType", так как этот тип находится на сервере во вложенной папке, а среда сканировать все подпапки проекта в поисках нужной сборки не будет. Так как прямого обращения (прям из кода) к сборке MyNamespace.MyServerObjType на сервере не было, то, видимо, среда успешно скомпилировала проект при перемещённой dll в подпапку. Вот и всё.
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34752205
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CodeMonkey94
Да, знает, ибо этот тип находится на клиенте и клиент знает, в какой сборке находится этот тип. С другой стороны серверная программа (основной exe) не знает, где находится его "MyNamespace.MyServerObjType", так как этот тип находится на сервере во вложенной папке, а среда сканировать все подпапки проекта в поисках нужной сборки не будет. Так как прямого обращения (прям из кода) к сборке MyNamespace.MyServerObjType на сервере не было, то, видимо, среда успешно скомпилировала проект при перемещённой dll в подпапку. Вот и всё.
Ты чет путаешь, ей богу. Так как сервис регистрится именно на сервере путем прямого обращения из кода к вышеупомянутой сборке :)
...
Рейтинг: 0 / 0
Activator.CreateInstance и Remoting
    #34752379
CodeMonkey94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А Вы проект сервера перекомпилировали, когда перекидывали dll файл в подпапку Plugins?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Activator.CreateInstance и Remoting
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]