Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > объявление API


Автор: efedron 11.7.2006, 09:37
Господа, подскажите что делаю не так:
Мне нужно инициализировать API одного приложения, в документации сказано:
Код

Получаем указатель на объект TFDDocsApp. Фн. Instance() - статическая и при любом количестве ее вызовов, всегда возвращает указатель на один и тот-же объект в памяти.

m_spApi = tfdAPI::TFDDocsApp::Instance();

Весь API находится в библиотеке tfdapi8.dll, добавляю ее в референс, потом пишу:
Код

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim m_api As Object
        m_api = tfdAPI.TFDDocsApp.Instance
    End Sub

при запуске возникает ошибка:
An unhandled exception of type 'System.IO.FileNotFoundException' occurred in system.windows.forms.dll
в дополнительной информации:
Unhandled Exception: System.IO.FileNotFoundException: File or assembly name tfdapi8, or one of its dependencies, was not found.
File name: "tfdapi8"

подскажите, в чем проблема? 

Автор: ivashkanet 11.7.2006, 09:57
Цитата(efedron @  11.7.2006,  09:37 Найти цитируемый пост)
File or assembly name tfdapi8, or one of its dependencies, was not found

Эта dll-ка должна лежать в папку с прогой.
Проверь, так ли это. Если нет, то в свойствах референса есть опция CopyLocal. Поставь ее в True  smile   

Автор: efedron 11.7.2006, 14:13
ivashkanet
Цитата

Эта dll-ка должна лежать в папку с прогой.

при компилляции она действительно кладется рядом с моим экзешником, но все равно он ее почему-то не находит
тем более, мне нужно, чтоб эта библиотека искалась по тому пути, где она лежит.
В свойствах проекта написано: Reference path: C:\Program files\{путь_к_библиотеке} - разве так работать не должно?? 

Автор: ivashkanet 11.7.2006, 14:22
efedron, не в курсе  smile 
Это все что я мог сказать по 
Цитата(efedron @  11.7.2006,  09:37 Найти цитируемый пост)
File or assembly name tfdapi8, or one of its dependencies, was not found.

 

Автор: efedron 11.7.2006, 15:38
ivashkanet
ну не знаю, что может быть такое? мож где-то что-то не так делаю? (я в VB.NET - профан) 

Автор: ivashkanet 11.7.2006, 15:53
efedron, попробуй положить dll рядом с приложением, что будет
А так, вроде, все правильно делаешь  smile 
 

Автор: efedron 12.7.2006, 10:31
ivashkanet,
в общем, заработало, когда я положил приложение в папку с dll (просто там лежат другие dll, которые полльзует объявляемая мной dll)
Вопрос в том, как заставить приложение искать tfdapi8.dll по такому пути, где она всегда лежит (c:\Program files\{путь})?? 

Автор: ivashkanet 12.7.2006, 11:05
Отлично  smile 
Что я могу сказать... Зайди в свойства проекта (правой на проекте в Solution Explorer --> Propertes).
Там открой вкладку References и полазь такм
А вообще, efedron, вопросы на прямую не касаемые VB лучше задавать в разделе 
http://forum.vingrad.ru/index.php?showforum=199 

Автор: DarkDragon 24.8.2006, 19:36
VB.NET тебе не даст такого. Так уж устроили разработчики из майкрософта. Вроде так была написанно в кратце об VS.NET на этом же сайте. Типа чтобы одни и те жи названия библиотек не мешались в данной деректории, они подумали целесообразно будет чтобы все библиотеки используемые программой лежали в месте с ней. Хотя System, Windows.Forms, Drawing и т.д. не лежат в месте с программой! А значить возможно?

Автор: ivashkanet 25.8.2006, 09:03
DarkDragon, все системные сборки лежат в GAC (Global Assembly Cache). В нем можно зарегистрировать любую сборку (при наличии у нее строгово имени (Strong name)).
P.S. Неужели нельзя ручками указать расположение файла smile 

Автор: Exception 26.8.2006, 13:24
При запуске приложения CLR ищет все библиотеки, на которые есть ссылки, в специальных каталогах: сначала в папке приложения, затем в подпапке с тем же именем, что и у сборки, затем проверяет .config-файл на наличие дополнительных указаний (указания подпапки или URL для загрузки), затем пробует загрузить сборку из GAC.
http://msdn.microsoft.com/msdnmag/issues/03/10/BasicInstincts/

Автор: DarkDragon 9.10.2006, 01:26
ivashkanet
А как ему этот Strong name указать? 

Exception
А можно примерчик с .config, а то недогоняю, как указать путь к какой нибудь библиотеке.

Еще можно через Reflector. Там вооще крутоsmile

Автор: ivashkanet 9.10.2006, 08:16
Цитата(DarkDragon @  9.10.2006,  01:26 Найти цитируемый пост)
А как ему этот Strong name указать? 

Если из VS, то все елементарно: открываем свойства проекта, вкладка Signing. Там выбираешь sign the assembly...
Если не из VS, то есть утилита командной строки, идущая вместе с Фрэймворком.

P.S. А вообще --- поиск рулит smile

Автор: DarkDragon 9.10.2006, 18:13
Наверное это реализуется, начиная с 2005 версии smile  

Автор: Exception 11.10.2006, 14:29
Цитата
Наверное это реализуется, начиная с 2005 версии smile   


Ты что smile ! Строгие имена были с самого зарождения .NET smile .

Автор: Wanderer2019 11.10.2006, 16:34
я недавно поднимал оооочень длинную тему по этому вопросу.... попробуй поиском найти...

а dll-ка она .NET`овская?

Автор: DarkDragon 11.10.2006, 18:07
Цитата

Ты что smile ! Строгие имена были с самого зарождения .NET smile . 


Я смотрел в Project->Properties, нету тама ни вкладки Signing, и строк с Sign smile
Там про Assembly, только Wrapper Asm... Key File, и Wrapper Asm... Key Name, и Assembly Name.

А как называется утилита коммандной строки?

Wanderer2019 , если ко мне то:
Цитата

я недавно поднимал оооочень длинную тему по этому вопросу.... попробуй поиском найти...

На форуме общие вопросы .NET?

Цитата

а dll-ка она .NET`овская? 

Ага.

Автор: Exception 11.10.2006, 20:04
Key file - это и есть файл ключа, которым подписывается сборка smile .

Автор: DarkDragon 11.10.2006, 22:55
Во я тормоз smile , даже не  догадался чей нибудь ключ спереть и установить на свою библиотеку smile Exceptionivashkanet пасибо, за направление на истенный путь smile . Ну а все таки как сделать через .config, дело в том что все библиотеки пихать в GAC не охота, и так тама целая куча, а вот если хапихать их в какую нибудь папку в Program Files, или Windows, вот это будет дело!

Автор: Wanderer2019 12.10.2006, 15:42
Вообщем суть дела такова...
Не обязательно пихать эту dll в GAC. Достаточно указать параметр в regasm, символизирующий чтение длл из текущий папки - /codebase.

Весь цикл по регистрации моей длл я делал следующим образом.
1. создал ключи при помощи утилитки sn 
(sn -k key.snk)
2. в файле AssemblyInfo.cs прописываешь строки о немедленном подписании.
(У меня там 3 строки касательно этого... что я писал, а что было я не помню поэтому выложу все
Код

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("../../key.snk")]
[assembly: AssemblyKeyName("")]

)
3. Компилишь - получаешь свою dll.
4. Регистришь ее средсвами RegAsm.
(regasm /tlb mycom.dll /codebase)

все. после этих действий я смог создать свой компонент из VBS через CreateObject("Namespace.Class")

Возможно данное описание чем то тебе поможет.

Автор: DarkDragon 13.10.2006, 00:22
Wanderer2019, Спасибоsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)