|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
Вопрос к знатокам ремоутинга. Имеем сервер и клиент, модель CAO (client activation). Активация на клиенте выполняется следующим образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
На сервере имеется собственно exe сервера и сборка, в которой выполняется регистрация (сборка является плугином и подгружается динамически при старте сервера, а лежит она в поддиректории Plugins директории, из которой запускается сервер): Код: plaintext 1.
При попытке активации с клиента Activator.CreateInstance выдает следующую ошибку: Код: plaintext 1.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Если сборку с серверным классом положить в папку с exe-файлом, то все работает. Вопрос в том, что надо подкрутить в ремоутинге, чтобы он находил нужную сборку на сервере в той папке, в которой я хочу, чтобы она лежала? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 17:33 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
Activator.CreateInstanceFrom ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 17:49 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
СлимаActivator.CreateInstanceFrom Не подходит - клиент о том, где на сервере чего лежит, вообще ничего знать не должен. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 17:57 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
MyNamespace.MyServerObjType должен быть и на сервере и на клиенте, при чём сборка должна быть одной и той же версии и там и там. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 18:40 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
CodeMonkey94MyNamespace.MyServerObjType должен быть и на сервере и на клиенте, при чём сборка должна быть одной и той же версии и там и там. Так и есть. Только на клиенте можно просто заглушку сделать - серверную сборку тащить не обязательно. Вопрос-то в другом. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 18:50 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
Может попробовать написать конфигурационный файл основного приложения, в котором указать <probing privatePath="plugins" />? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 19:17 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
Например, файл 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 19:22 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
Спасибо. Оно ) Так работает. Правда, все-равно остается непонятным, почему рантайм не может автоматически найти нужную сборку, ведь на этапе регистрации серверного класса я явно указываю его тип, а раз известен тип - стало быть известно и где он находится, разве не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 19:47 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
Не так. Программа будет обращаться к типу, находящемуся в сборке, нахождение которой неизвестно. Среда CLR не будет зондировать все подкаталоги проекта, если не попросить её об этом через конфигурационный файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 20:06 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
CodeMonkey94Не так. Программа будет обращаться к типу, находящемуся в сборке, нахождение которой неизвестно. Среда CLR не будет зондировать все подкаталоги проекта, если не попросить её об этом через конфигурационный файл.Почему неизвестно? Вот ты скажи: когда я вызываю RegisterActivatedServiceType и передаю туда тип сервиса, рантайм знает, где этот тип находится? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 20:16 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
Dedushka MazaiПочему неизвестно? Вот ты скажи: когда я вызываю RegisterActivatedServiceType и передаю туда тип сервиса, рантайм знает, где этот тип находится? Да, знает, ибо этот тип находится на клиенте и клиент знает, в какой сборке находится этот тип. С другой стороны серверная программа (основной exe) не знает, где находится его "MyNamespace.MyServerObjType", так как этот тип находится на сервере во вложенной папке, а среда сканировать все подпапки проекта в поисках нужной сборки не будет. Так как прямого обращения (прям из кода) к сборке MyNamespace.MyServerObjType на сервере не было, то, видимо, среда успешно скомпилировала проект при перемещённой dll в подпапку. Вот и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 20:40 |
|
Activator.CreateInstance и Remoting
|
|||
---|---|---|---|
#18+
CodeMonkey94 Да, знает, ибо этот тип находится на клиенте и клиент знает, в какой сборке находится этот тип. С другой стороны серверная программа (основной exe) не знает, где находится его "MyNamespace.MyServerObjType", так как этот тип находится на сервере во вложенной папке, а среда сканировать все подпапки проекта в поисках нужной сборки не будет. Так как прямого обращения (прям из кода) к сборке MyNamespace.MyServerObjType на сервере не было, то, видимо, среда успешно скомпилировала проект при перемещённой dll в подпапку. Вот и всё. Ты чет путаешь, ей богу. Так как сервис регистрится именно на сервере путем прямого обращения из кода к вышеупомянутой сборке :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 23:46 |
|
|
start [/forum/topic.php?fid=19&msg=34752379&tid=1398041]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
199ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 317ms |
0 / 0 |