18.12.2015, 23:18 | #1 |
Участник
|
Добавление DLL в reference
Добрый вечер. Подскажите плиз, что делаю не так.
Есть некая библиотека, положил её на сервере в папку C:\Program Files\Microsoft Dynamics AX\50\Client\Bin. Добавил DLL в GAC "gacutil /i Report.dll" DLL добавил в reference Dynamics AX. Сделал рестарт AOS Пытаюсь работать с библиотекой на стороне клиента, ругается на первую же строчку, как "Таблица не содержит это поле." Report.Report fr; InteropPermission dllPermission = new InteropPermission(InteropKind::ClrInterop); ; fr = new Report.Report(); fr.Design(); Если делаю все тоже самое на стороне клиента, все работает. AX 2009ru5 |
|
19.12.2015, 07:33 | #2 |
Участник
|
Report.Report fr;
InteropPermission dllPermission = new InteropPermission(InteropKind::ClrInterop); ; dllPermission.assert(); fr = new Report.Report(); fr.Design(); CodeAccessPermission::revertAssert(); |
|
19.12.2015, 08:35 | #3 |
Участник
|
Я не всё понял из вашего потока сознания, но применив свои способности телепатии 80 уровня, пришел к выводу, что вы положили файл на одну машину, а пытаетесь работать с ним на другой.
Неудивительно, что это не работает. |
|
19.12.2015, 09:25 | #4 |
Участник
|
Обьясните пожалуйста. Да, цель работать со сборкой, зарегистрированной на сервере на клиентских машинах. И что ж вас так ввело в стопор, не пятница ли случайно?
|
|
19.12.2015, 16:27 | #5 |
Участник
|
Открою большой секрет - сегодня не пятница, а суббота.
Вы же сами написали: Цитата:
положил её на сервере
Цитата:
Пытаюсь работать с библиотекой на стороне клиента
Вариант - если можно, что код нужно писать для работы на стороне сервера (хотя это и не всегда возможно - пример сканер, включающийся в разрыв клавиатуры) |
|
19.12.2015, 17:24 | #6 |
Участник
|
Цитата:
Сообщение от Raven Melancholic
Открою большой секрет - сегодня не пятница, а суббота.
Вы же сами написали: Клиент не имеет понятия что там на стороне сервера. Если библиотека вызывается на стороне клиента, то и доступна она должна быть на стороне клиента. Вариант - если можно, что код нужно писать для работы на стороне сервера (хотя это и не всегда возможно - пример сканер, включающийся в разрыв клавиатуры) Согласен, клиент не знает. Но смысл добавлять библиотеки в reference, если с ними нельзя работать, не размещая библиотеки на стороне клиента? Код размещен в классе, у которого стоит вызов с сервера |
|
20.12.2015, 18:08 | #8 |
MCITP
|
А почему вы её на сервере положили в клиентскую папку?
(C:\Program Files\Microsoft Dynamics AX\50\Client\Bin) Просто интересно. Я когда клал для 2009ки в Server-ную папку, то работало даже без GAC-а для серверного кода. Для клиентского кода как уже было отмечено - длл-ка должна быть на соответствующем клиенте.
__________________
Zhirenkov Vitaly |
|
20.12.2015, 19:46 | #9 |
Участник
|
Цитата:
Сообщение от ZVV
А почему вы её на сервере положили в клиентскую папку?
(C:\Program Files\Microsoft Dynamics AX\50\Client\Bin) Просто интересно. Я когда клал для 2009ки в Server-ную папку, то работало даже без GAC-а для серверного кода. Для клиентского кода как уже было отмечено - длл-ка должна быть на соответствующем клиенте. |
|
20.12.2015, 23:05 | #10 |
Участник
|
Мне кажется, стоит внести некоторую ясность в используемую терминологию. Добавление .NET-сборки в References - это указание клиенту и серверу, что используемые в коде X++ .NET-типы надо искать в том числе в сборке с таким именем ("строгим" именем, если сборка имеет цифровую подпись), при этом никакого "подключения" физически не происходит: в АОТ всего лишь добавляется немного метаданных сборки для её последующего поиска. Далее, обращение к сборке может идти, во-первых, во время компиляции кода, во-вторых, во время выполнения кода, причём очевидно, что второго без первого быть не может. Наконец, надо учесть, что в 2009-й компиляция выполняется на клиенте.
Таким образом, чтобы работать со сборкой на сервере, она должна быть доступна на всех хостах АОСов, где предполагается выполнять код, использующий типы из сборки. Но сначала сборка должна быть доступна на клиенте, где будет скомпилирован этот код. Как вариант, компиляцию можно запустить не "у себя", а на хосте АОСа, где лежит сборка, при этом она должна быть либо в GAC, либо и в bin АОСа (для загрузки во время выполнения), и в bin клиента (для загрузки во время компиляции). И все получится |
|
|
За это сообщение автора поблагодарили: alex55 (1), Ilyaae (1). |
21.12.2015, 11:52 | #11 |
MCITP
|
Цитата:
Сообщение от Ilyaae
Ну мне так же было интересно, вот и пытался достигнуть результата экспериментальным путем. Результат пока 0-ой. Если положить библиотеку в папку серверную, то код выполняется на сервере, а с клиентской машины, даже если стоит вызов класса с сервера, выдает ошибку(см. 1-й пост). Ну собственно где то так. Вот и вопрос, а можно ли работать со сборкой, на клиентской машине, если библиотека подключена на сервере?
Довольно вроде очевидно, что если вы хотите подложить длл серверу, то надо класть его в Сервер\Бин, а если клиенту - то в клиентскую папку на клиентском компьютере. А в вашем описанном примере вы (вероятно) сделали ни то ни сё... Сам когда-то ковырялся с этой темой тоже эксперементальным путём.. Согласен с gl00mie - всё работает именно так. Единственный момент, который возможно будет интересен - в случае серверной dll в серверном коде на AX 2009 не будут работать byref переменные. Они компиляться и вроде как работают но по факту всегда возвращают Нуль. Если перенести на клиент - всё нормально работает. В 2012 это исправили.
__________________
Zhirenkov Vitaly |
|
21.12.2015, 13:59 | #12 |
Участник
|
Цитата:
Сообщение от ZVV
Вообще-то это была ирония...
Довольно вроде очевидно, что если вы хотите подложить длл серверу, то надо класть его в Сервер\Бин, а если клиенту - то в клиентскую папку на клиентском компьютере. А в вашем описанном примере вы (вероятно) сделали ни то ни сё... Сам когда-то ковырялся с этой темой тоже эксперементальным путём.. Согласен с gl00mie - всё работает именно так. Единственный момент, который возможно будет интересен - в случае серверной dll в серверном коде на AX 2009 не будут работать byref переменные. Они компиляться и вроде как работают но по факту всегда возвращают Нуль. Если перенести на клиент - всё нормально работает. В 2012 это исправили. C:\Program Files\Microsoft Dynamics AX\50\Client\Bin Сейчас перенес в серверную папку, класс компилится на сервере. Копаю дальше. |
|
21.12.2015, 14:23 | #13 |
MCITP
|
Цитата:
именно об этом я писал выше... На сервере она должна быть в серверной папке, а на клиенте - в клиентской. Если запускаете клиента непосредственно с сервера - тогда в обоих.
__________________
Zhirenkov Vitaly |
|
21.12.2015, 16:00 | #14 |
Участник
|
Если вы хотите использовать DLL на машине клиента, то DLL должна быть на машине клиента. Так уж устроено. На машину(сервер) эту DLL можно не ложить, на машину(клиента, на которой будет лежать DLL) этот факт ни как не повлияет, код клиента будет работать с DLL без проблем.
|
|
21.12.2015, 16:49 | #15 |
Участник
|
Ну, мне надо, чтоб DLL была на сервере и клиенты могли с ней работать. Смысл мне например на 50 ящиков ходить устанавливать её. А если винду переустанови, опять устанавливай, регистрируй.
|
|
21.12.2015, 19:31 | #16 |
Участник
|
Цитата:
"надо чтобы клиенты могли работать с DLL" и "надо чтобы клиенты могли запускать код работающий с DLL на сервере" - это разные вещи. Разница в окружении с которым будет работать DLL. Если реально из DLL не происходит взаимодействия с клиентским окружением то вас должен устроить второй вариант. Цитата:
Ещё раз. Выполнить клиентский код физически запускаясь на сервере не тоже самое что выполнить серверный код запускаясь с клиентской машины. Не знаю как ещё понятнее объяснить. |
|
|
За это сообщение автора поблагодарили: Ilyaae (1). |
21.12.2015, 21:49 | #17 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Мне кажется вы не до конца всё правильно понимаете/изъясняетесь.
"надо чтобы клиенты могли работать с DLL" и "надо чтобы клиенты могли запускать код работающий с DLL на сервере" - это разные вещи. Разница в окружении с которым будет работать DLL. Если реально из DLL не происходит взаимодействия с клиентским окружением то вас должен устроить второй вариант. Вот в эту сторону смотрите. Вам уже намекали что в серверном режиме не работает потому что папка не та. Ещё раз. Выполнить клиентский код физически запускаясь на сервере не тоже самое что выполнить серверный код запускаясь с клиентской машины. Не знаю как ещё понятнее объяснить. |
|
23.12.2015, 19:27 | #18 |
Участник
|
|
|
24.12.2015, 11:08 | #19 |
Участник
|
Цитата:
вызывается при запуске аксапты |
|
|
За это сообщение автора поблагодарили: ZVV (2), sukhanchik (2). |