Вызов API из C# DLL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Вызов API из C# DLL

Сообщение visualman » 17.07.2012 (Вт) 22:48

Приветствую!

Проблема такая: требуется дёргать функции DLL, написанной на С#.

Декларации писал, не прокатывает. Без ошибок, но тупо не работает.

Вся документация на Dll есть.

Как быть?

Заранее спасибо!!
Последний раз редактировалось visualman 17.07.2012 (Вт) 23:56, всего редактировалось 1 раз.
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов API из C# DLL

Сообщение Хакер » 17.07.2012 (Вт) 23:30

visualman писал(а):В компоненты такие DLL не добавляются (Error loading library или что по такое).

В действиях должен быть смысл. Смысл в действиях бывает когда есть понимание того, что ты делаешь. Как можно брать человека на работу, если он тыкает наугад и не понимает смысл действий,

В компоненты добавляются ActiveX-компоненты, которые являются COM-серверами. Надо отдавать себя отчёт в том, чем именно является написанная на сишарпе библиотека. Является ли она ActiveX-контролом? Или она является просто ActiveX-сервером (классы не являются контроллами)? Или она является COM-сервером, не поддерживающим ActiveX (коими являются например DirectX-овые библиотеки)? Или она вообще не является COM-сервером? Может она является библиотекой, экспортирующей сущности в стиле С++, например, экспортирующая в том числе и С++-классы? Или может она является просто библиотекой, экспортирующей функции?

Надо отдавать себе отчёт о том, что ты держишь в руках, и в зависимости от этого, делать правильные вещи.

visualman писал(а):Вся документация на Dll есть.

Ну так и выложи сюда хоть что-нибудь, или ты в загадки пришёл играть?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 17.07.2012 (Вт) 23:53

Мда... Наверное я не так объяснил...
А отчёт я себе отдаю...
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов API из C# DLL

Сообщение Хакер » 17.07.2012 (Вт) 23:59

visualman писал(а):А отчёт я себе отдаю...

Тогда напиши, какая именно DLL у тебя из кучи возможных вариантов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Вызов API из C# DLL

Сообщение FireFenix » 18.07.2012 (Ср) 0:42

visualman писал(а):Декларации писал, не прокатывает. Без ошибок, но тупо не работает.

Значит ты просто не умеешь с ней работать.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.07.2012 (Ср) 7:11

FireFenix писал(а):Значит ты просто не умеешь с ней работать.

Хм... А это вообще возможно? Кроме Си++.NET?

Хакер писал(а):Является ли она ...

Насколько я представляю, все .NET dll одинаковы. Опять же, кроме Си++.NET.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов API из C# DLL

Сообщение Хакер » 18.07.2012 (Ср) 7:24

Qwertiy писал(а):Насколько я представляю, все .NET dll одинаковы.

Ну понятно, что .NET dll одинаковы, и с точки зрения дотнетчиков они так и зовутся. Но с точки зрения внешнего мира они являются чем-то из упомянутого (или не упомянутого). Вот надо написать, чем они являются.

И если они хоть как-то допускают вызов из внешнего недотнетского мира, то должны быть какие-то call-gate-ы-переходники, и значит можно вызывать хоть из VB6, хоть из VBA, хоть откуда.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.07.2012 (Ср) 7:38

Хакер писал(а):Но с точки зрения внешнего мира они являются чем-то из упомянутого (или не упомянутого). Вот надо написать, чем они являются.

А являются ли? Там же промежуточный код... В любом случае, экспортируемых функций там нет. Да и остального тоже, наверное.

Хакер писал(а):И если они хоть как-то допускают вызов из внешнего недотнетского мира

А они допускают? Единственный известный мне способ использования .NET из native кода - это mixed dll на Си++.NET, которые помимо .NET'овского кода могут экспортировать нативные классы/функции.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов API из C# DLL

Сообщение Хакер » 18.07.2012 (Ср) 7:51

Qwertiy писал(а):А являются ли?

В любом случае они являются чем-то. Если уж там правда нет ни одной экспортируемой сущности (в чём я очень сомневаюсь), то уж в любом случае есть что-то другое, например дотнет-специфичная директория в каталоге директорий, откуда берётся инфа об экспортируемых сущностях.

Qwertiy писал(а):А они допускают?

Это проблема из мира дотнетчиков :)
Мы умеем юзать всё что угодно. Умеете ли вы делать юзабельные извне DLL-шки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Вызов API из C# DLL

Сообщение FireFenix » 18.07.2012 (Ср) 8:06

Qwertiy писал(а):
FireFenix писал(а):Значит ты просто не умеешь с ней работать.

Хм... А это вообще возможно? Кроме Си++.NET?

Виндовс же их загружает, значит ничего нет невозможного.

Где то был мануал, в котором идём вызов самой CLR и скармливание dll'ки. Ну и с помощью CLR-функций идёт с ней общение
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.07.2012 (Ср) 8:12

Хакер писал(а):В любом случае они являются чем-то.

Расскажи чем - интересно узнать :)

Код: Выделить всё
echo public static class Sample { public static int Sum(int x, int y) {return x+y;} } >sample.cs
%systemroot%\Microsoft.NET\Framework\v3.5\csc.exe /target:library /optimize+ /debug- /out:sample.dll sample.cs
del sample.cs
Версию фреймвёка выберешь из имеющихся у тебя :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов API из C# DLL

Сообщение Хакер » 18.07.2012 (Ср) 8:40

Qwertiy писал(а):Расскажи чем - интересно узнать :)

Я-то откуда знаю? Я не приверженец дотнета, я противник дотнета.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.07.2012 (Ср) 8:43

Хакер писал(а):Я-то откуда знаю?

Отсюда:
Хакер писал(а):Ну так и выложи сюда хоть что-нибудь
Qwertiy писал(а):
Код: Выделить всё
echo public static class Sample { public static int Sum(int x, int y) {return x+y;} } >sample.cs
%systemroot%\Microsoft.NET\Framework\v3.5\csc.exe /target:library /optimize+ /debug- /out:sample.dll sample.cs
del sample.cs
Версию фреймвёка выберешь из имеющихся у тебя :)

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 18.07.2012 (Ср) 10:00

Ребят, скоро выложу сорс тестовой DLL на C#. Нужно попробовать вызвать функцию. Не бросайте меня )

Спасибо!
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 18.07.2012 (Ср) 10:48

Ребят, вот солюшен на C#

Интересует вызов функции GetSum из CalcLib.dll
Вложения
calczip.zip
(588.35 Кб) Скачиваний: 81
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.07.2012 (Ср) 13:42

1. А при чём тут вообще VB6?
2. Твой код правильный и даже работает!
3. Для обращения к сервису он должен быть запущен...
4. Для регистрации url надо запускать хост с админскими правами.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re:

Сообщение visualman » 18.07.2012 (Ср) 13:57

Qwertiy писал(а):1. А при чём тут вообще VB6?
2. Твой код правильный и даже работает!
3. Для обращения к сервису он должен быть запущен...
4. Для регистрации url надо запускать хост с админскими правами.


VB при том, что я на нём буду должен писать тестовые скрипты для C# библиотек. Ибо на C# я писать не умею.
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Вызов API из C# DLL

Сообщение Viper » 18.07.2012 (Ср) 14:22

visualman писал(а):VB при том, что я на нём буду должен писать тестовые скрипты для C# библиотек. Ибо на C# я писать не умею.
Вызвать надо в VB6 или все же в VB.NET? Если второе, то никаких проблем быть не должно вообще, если все-таки VB6, то решение ЕМНИП описано у Эпплмана в "Переход на VB .NET. Стратегии, концепции, код".
Весь мир матрица, а мы в нем потоки байтов!

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 18.07.2012 (Ср) 14:23

Viper писал(а):
visualman писал(а):VB при том, что я на нём буду должен писать тестовые скрипты для C# библиотек. Ибо на C# я писать не умею.
Вызвать надо в VB6 или все же в VB.NET? Если второе, то никаких проблем быть не должно вообще, если все-таки VB6, то решение ЕМНИП описано у Эпплмана в "Переход на VB .NET. Стратегии, концепции, код".

Из VB6
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 18.07.2012 (Ср) 14:25

visualman писал(а):
Viper писал(а):
visualman писал(а):VB при том, что я на нём буду должен писать тестовые скрипты для C# библиотек. Ибо на C# я писать не умею.
Вызвать надо в VB6 или все же в VB.NET? Если второе, то никаких проблем быть не должно вообще, если все-таки VB6, то решение ЕМНИП описано у Эпплмана в "Переход на VB .NET. Стратегии, концепции, код".

Из VB6


C .Net понятно, что ни каких проблем. А нужно из VB6. Потому тема и появилась.
Переходить я не собираюсь. Я тоже ярый противник .NET
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.07.2012 (Ср) 14:47

У тебя вообще сервис, а не dll. Ему абсолютно всё равно, кто его вызывает. Проблем не должно быть ни с одним языком, в котором поддерживаются сервисы.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Вызов API из C# DLL

Сообщение iGrok » 18.07.2012 (Ср) 14:51

Qwertiy писал(а):
Код: Выделить всё
echo public static class Sample { public static int Sum(int x, int y) {return x+y;} } >sample.cs
%systemroot%\Microsoft.NET\Framework\v3.5\csc.exe /target:library /optimize+ /debug- /out:sample.dll sample.cs
del sample.cs

"Классических" экспортируемых сущностей нет, но есть некая .NET MetaData Directory с описанием содержащихся .NET сущностей.

Насколько я понимаю, со всем этим бобром можно работать, создав экземпляр нужного класса при помощи ClrCreateManagedInstance из mscoree.dll
http://interop.managed-vcl.com/netinterop_csharp.php писал(а):Initiate .Net object without COM

It is possible to create instance of .Net class without registering it for COM. In this case .Net assembly should be located in GAC or in project directory. T o do this us e ClrCreateManagedInstance() function exported from mscoree.dll - main .Net file (like ole32.dll for COM) . This function works like CoCreateInstance() for COM objects.

Example in handler for "Create .Net object without COM" button uses external keyword but it is possible to load mscoree.dll with LoadLibrary() function and get address of ClrCreateManagedInstance() with GetProcAddress().

When calling ClrCreateManagedInstance(), supply full class name (including namespace) and assembly name, such as: "Interop.Test.InterfacedClass, CSharpAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b4eba4c5f06ce523" and interface you want to get - IUnknown, IDispatch or any interface that is implemented in .Net class and is COM visible. .Net object needs to have public contructor without parameters.
label:
cli
jmp label

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re:

Сообщение visualman » 18.07.2012 (Ср) 14:54

Qwertiy писал(а):У тебя вообще сервис, а не dll. Ему абсолютно всё равно, кто его вызывает. Проблем не должно быть ни с одним языком, в котором поддерживаются сервисы.

Сервис, это просто для примера работы. Да, надо было не весь солюшен выкладывать, а только сорс DLLки. Спасибо за функцию! Ща почитаю.
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Вызов API из C# DLL

Сообщение Vi » 19.07.2012 (Чт) 10:44

Из Calc\CalcLib\Properties\AssemblyInfo.cs :

Код: Выделить всё
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

Ты ничего с ней из VB6 не сделаешь. Потому что пустая она. ;) Попробуй "RegAsm.exe /tlb CalcLib.dll", чтобы убедиться в её пустоте.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 19.07.2012 (Чт) 10:57

Vi писал(а):Из Calc\CalcLib\Properties\AssemblyInfo.cs :

Код: Выделить всё
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

Ты ничего с ней из VB6 не сделаешь. Потому что пустая она. ;) Попробуй "RegAsm.exe /tlb CalcLib.dll", чтобы убедиться в её пустоте.


Ну как же пустая? Я прекрасно с ней из vb.net работаю. Там одна функция - GetSum
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Вызов API из C# DLL

Сообщение Vi » 19.07.2012 (Чт) 11:11

visualman писал(а):Ну как же пустая? Я прекрасно с ней из vb.net работаю. Там одна функция - GetSum

Тебе нужно в VB6 или в VB.NET? Там механизм доступа к метаданным разный. Наверное, мне нужно было уточнить, что с точки зрения VB6 (как и вообще СОМ) она пустая.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 19.07.2012 (Чт) 11:17

Vi писал(а):
visualman писал(а):Ну как же пустая? Я прекрасно с ней из vb.net работаю. Там одна функция - GetSum

Тебе нужно в VB6 или в VB.NET? Там механизм доступа к метаданным разный. Наверное, мне нужно было уточнить, что с точки зрения VB6 (как и вообще СОМ) она пустая.

КЭП, спасибо! Поста бы небыло, была бы она COM. VB6 нужен. Ладно, я уже смирился. Придётся на .NET писать.

Можно пост закрывать.
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов API из C# DLL

Сообщение Хакер » 19.07.2012 (Чт) 11:26

visualman писал(а):Ладно, я уже смирился.

Это худшее, что можно сделать в твоём случае. В любом случае.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Вызов API из C# DLL

Сообщение visualman » 19.07.2012 (Чт) 11:34

Хакер писал(а):
visualman писал(а):Ладно, я уже смирился.

Это худшее, что можно сделать в твоём случае. В любом случае.

Знаю ( Буду исследовать. Может получится всё же.
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Вызов API из C# DLL

Сообщение Vi » 19.07.2012 (Чт) 11:38

visualman писал(а):КЭП, спасибо! Поста бы небыло, была бы она COM. VB6 нужен. Ладно, я уже смирился. Придётся на .NET писать. Можно пост закрывать.

Так открой атрибуты на видимость. NETу не убудет, а для скриптов и VB6 она станет доступна.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 88

    TopList