Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Общие вопросы Ирбис64 :  ИРБИС Irbis
 
Работа с irbis64_client из .Net
Пользователь: vo-vam (IP-адрес скрыт)
Дата: 16, November, 2013 19:42

Доброе время суток.
Пробую работать с системой, используя библиотеку irbis64_client, из VS 2012, а конкретно из ASP.Net.

Понизил безопасность Windows - отключил DEP.
Код в проекте следующий (использовал P/Invoke):

namespace IrbisClient
{
static class IRBIS_ARM
{
public const char IRBIS_READER = 'R';
public const char IRBIS_ADMINISTRATOR = 'A';
public const char IRBIS_CATALOG = 'C';
public const char IRBIS_COMPLECT = 'M';
public const char IRBIS_BOOKLAND = 'B';
public const char IRBIS_BOOKPROVD = 'K';
}

public class IRBIS_Func
{

[DllImport("c:\\irbis64_client.dll", EntryPoint = "IC_reg", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern System.Int32 IC_reg(
[In, MarshalAs(UnmanagedType.LPStr)] System.String aserver_host,
[In, MarshalAs(UnmanagedType.LPStr)] System.String aserver_port,
char arm,
[In, MarshalAs(UnmanagedType.LPStr)] System.String user_name,
[In, MarshalAs(UnmanagedType.LPStr)] System.String password,
[Out, MarshalAs(UnmanagedType.LPStr)] out System.String answer,
[Out] out System.Int32 abufsize);

public System.String answer = "";
public System.Int32 abufsize = 0;

public IRBIS_Func()
{
System.Int32 res = IC_reg("127.0.0.1", "6666", IRBIS_ARM.IRBIS_ADMINISTRATOR, "1", "1", out answer, out abufsize);
}

}


Запуск кода выдает ошибку:
PInvokeStackImbalance was detected
Message: Вызов функции PInvoke "irbis!IrbisClient.IRBIS_Func::IC_reg" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.

Если изменить порт на неправильный, то появляется окно ожидания ответа сервера и висит неограниченное количество времени.


Кто-нибудь может помочь решить проблему использования этой библиотеки из .Net?

P.S.
Вопрос: зачем мне это надо?
Ответ: заказчик хочет выводить на своём портале данные из ИРБИС.



Редактировано 1 раз. Последний раз 16.11.2013 19:43 пользователем vo-vam.

Re: Работа с irbis64_client из .Net
Пользователь: S-presso (IP-адрес скрыт)
Дата: 17, November, 2013 08:55

Обращаю Ваше внимание на то, что параметр abufsize должен быть входящим, а не исходящим - это передаваемое в функцию значение количества байт, которое Вы отводите под буфер answer. Но и после этого Ваш код не заработает. Я экспериментировал с разными типами и атрибутами параметра answer, и мне не удалось передать его как String. Моё работающее описание этого параметра в функции IC_reg выглядит так: ref StringBuilder answer. Полностью вызов функции в Вашем случае может выглядеть таким образом:

int abufsize = 32000;
StringBuilder text = new StringBuilder(abufsize);
res = IC_reg("127.0.0.1", "6666", IRBIS_ARM.IRBIS_ADMINISTRATOR, "1", "1", ref text, abufsize);
answer = text.ToString();

Вообще, Ваше описание функции IC_reg излишне усложнено преобразованиями параметров из неуправляемых типов в управляемые. Всё можно сделать прощеsmiling smiley. Вот как прототип этой функции выглядит у меня:

[DllImport("irbis64_client",
EntryPoint = "IC_reg",
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.StdCall)]
// инициализация и регистрация клиента для работы с сервером
public static extern int IC_reg(string aserver_host,
string aserver_port,
char arm,
string user_name,
string password,
ref StringBuilder answer,
int abufsize);


Кстати, не лучше ли вместо создания собственной прослойки для вызова неуправляемых функций irbis64_client.dll воспользоваться уже готовой библиотекой для работы с сервером ИРБИС64 напрямую из-под .NET, которую недавно выкладывали на этом форуме? Вот эта тема: [irbis.gpntb.ru], я сейчас сам создаю новый управляемый клиент на C# с её помощью.

Re: Работа с irbis64_client из .Net
Пользователь: vo-vam (IP-адрес скрыт)
Дата: 17, November, 2013 18:09

S-presso,
Исчерпывающий совет!
Упрощённый вариант отработал сразу же. Правда вернул код -1.
По поиску не смог найти тему ИРБИС из-под .Net. Обязательно сейчас поизучаю.

Спасибо.



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.