Консультация № 170117
02.07.2009, 23:48
0.00 руб.
0 6 1
Здравствуйте!
У меня вопрос про использование dll в C# проекте.
Есть проект с MDI формой, в этом же солюшене добавлена отдельным проектом dll, написаная на С#. версия VS2008.
во время работы в месте вызова функции func1 из dll-ки возникает ошибка
"Unable to find an entry point named 'func1' in DLL 'cClassLib.dll'."

Я пыталась подключить dll через DllImport и добавила ее в Reference к проекту - не работает. Пробовала написать dll на С++ - итог тот же. сама библиотека явно видна (если сделать ошибку в названии в DLLIMPORT то ошибка вылазит другая).

Есть ощущение что сама dll написана неправильно.
Код в приложении:

Приложение:
класс dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace cClassLib
{
public class cRunLib
{
[System.Reflection.Obfuscation(Feature = "DllExport")]
public static int func1(Int32 new_len)
{
.....
}

....
public static void Main(string[] args) //<-------она тут нужна и что в ней писать??
{

}

}

}

класс формы, использующий dll:

...
using System.Runtime.InteropServices; //for dll

namespace csNNN
{
public partial class Form1 : Form
{
[DllImport("cClassLib.dll", EntryPoint = "func1")]
public static extern int func1(int new_len);

....
public void func2()
{
func1(10); //<-----------вот тут вылазит ошибка
}
}


}

Обсуждение

Неизвестный
03.07.2009, 00:43
общий
Badkitty:
Если библиотека написана на C# и используется в .Net, то никакие дополнительные атрибуты не нужны. Надо добавить ее в References и функция будет доступна как cClassLib.cRunLib.func1.
А в C++ действительно надо открывать эту функцию.

#if defined (_MSC_VER)
#define DLL_DEF extern "C" __declspec(dllexport)
#else
#define DLL_DEF extern "C"
#endif
DLL_DEF int BildenUmgebung(char*);

Использовать ее потом вот так:
[DllImport(DLLName, EntryPoint="BildenUmgebung")]
static extern int bildenUmgebung(String FileName);
Неизвестный
03.07.2009, 01:12
общий
это ответ
Здравствуйте, Badkitty.
Вы используете сборку .NET. Не надо применять никакой DllImport. Добавьте ее в зависимости(References) и используйте. Только не забудьте добавить директиву using cClassLib и обращаться к методу класса как и положено cRunLib.func1(num)

Код:

using System;
using cClassLib;

namespace csNNN
{
public partial class Form1:Form
{
public void func2()
{
cRunLib.func1(10);
}
}
}
5
Спасибо!
Неизвестный
03.07.2009, 01:16
общий
Badkitty:
И Main() в библиотечном классе не нужен.

В моем примере забыл добавить сборку System.Windows.Forms
Неизвестный
03.07.2009, 09:39
общий
Всем спасибо за советы, я убрала DLLIMPORT, библиотека подключена через Reference, добавила
using cClassLib

Теперь вылазит другая ошибка, когда запускаю программу на выполнение:
Could not load type 'csNNN.Form1' from assembly 'csNNN, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'func1' has no implementation (no RVA).

Неизвестный
03.07.2009, 09:52
общий
разобралась.
работает если использовать полный путь cClassLib.cRunLib.func1() и вообще не прописывать функцию в классе Form1 как external.
Неизвестный
03.07.2009, 11:54
общий
Badkitty:
Естественно прописывать метод как external не надо было. Сборка подключена и использование ее точно такое же как и любой другой .NET сборки. Вы ведь не объявляете external методы классов из пространства System. Например, Console.Write() и т.п.
Форма ответа