Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2011, 07:09   #1
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
Вопрос Як вызвать функцию из dll в C# ?

Здравствуйте... Помогите вызвать функцию из dll в C#.
dll создана на VB (VS2010). Вот код dll:
Код:
Public Class EnigmaLibClass

    Dim inStr As String           ' input string
    Dim inKey As String          ' key
    Dim outStr As String         ' the returned string
    Dim i, j As Integer            ' for loop counters
    Dim codeAscii As Integer   ' to store a character code ascii


    //Функция шифрует получаемый текст по получаемому ключу методом ASCII

    Public Function AsciiTextEncode(ByVal str As String, ByVal key As String)

        outStr = ""    ' zero return string 

        inStr = str    ' get source string
        inKey = key  ' get key

        j = 0       ' reset a counter for a key

        For i = 0 To Len(inStr) - 1     ' scans the input string character by character

            If j > Len(inKey) - 1 Then  ' if the characters in the key over, ->
                j = 0                          ' then start again
            End If

            codeAscii = Asc(inStr(i)) + Asc(inKey(j))   ' merge characters together
            j = j + 1                                ' the next character key

            If codeAscii >= 255 Then         ' if the code is beyond the scope Ascii table, -> 
                codeAscii = codeAscii - 255  ' then displace
            End If

            outStr = outStr + Chr(codeAscii) ' Putting a string of new characters merged

        Next

        Return outStr ' return the encrypted string

    End Function
............

End Class
Теперь мне необходимо вызвать функцию из dll в C# (VS2010).
Вот код разрабатываемой программы:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EnigmaLib;    //+ Reference

namespace TextEncoder
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private void btnEncode_Click(object sender, EventArgs e)
        {
            string deText   =   tbxIOText.Text; // текст для шифрования
            string deKey    =   tbxKey.Text;     // ключ

            // Здесь мне необходимо вызвать функцию, примерно так:
            // tbxIOText.Text  =   EnigmaLibClass.AsciiTextEncode(deText,deKey);
            
        

        }
    }
}
Как мне вызвать функцию ? Как сделать это правильней ? Может я неправильно разработал библиотеку классов ? Выслушаю любые комментарии, касательно данного проекта....

Последний раз редактировалось Stilet; 26.09.2011 в 08:19.
Dr.Pauliss вне форума Ответить с цитированием
Старый 26.09.2011, 09:14   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я не знаток VB, поэтому нужно уточнить - код длл будет для платформы .Net? Это важно - подключать можно два вида библиотек - Нетовские и чужие . Ну по-простому в Солюшен Эксплорер есть элемент Референцес - жмакай правой кнопой - Add Reference Там вкладка Browse. Вот и выбирай свою dll.
Ну и в самом классе прицепить через using...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 26.09.2011 в 09:16.
Utkin вне форума Ответить с цитированием
Старый 26.09.2011, 11:26   #3
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
По умолчанию

Да dll писал в VS2010 под .net 4.0, c подключением проблем нет. Мне даже удаётся создавать экземпляр класса из моей dll:

EnigmaLibClass encrypted = new EnigmaLibClass();

Вопрос в том, как мне вызвать функцию AsciiTextEncode из моей dll.
IDE не выводит названия функции в автоматической подстановке.

Вот так подставляет:
tbxIOText.Text = encrypted.AsciiTextEncode(deText, deKey); // Но это неверно (не работает)...

Мне нужно вот так:
tbxIOText.Text = AsciiTextEncode(deText, deKey); // Просто вызвать функцию и передать ей параметры, но IDE не выводит её в автоматической подстановке.

Даже так не подставляет
tbxIOText.Text = EnigmaLibClass.(не подставляет названия функций).

Я думаю может в dll коде чего не хватает (там.. конструкторов - деструкторов каких нить...).
Как мне правильно вызвать функцию (как, вообще, к ней обратиться) ?
Dr.Pauliss вне форума Ответить с цитированием
Старый 26.09.2011, 12:02   #4
G-Kyller
Пользователь
 
Регистрация: 11.03.2011
Сообщений: 67
По умолчанию

Делаешь это:
Цитата:
у по-простому в Солюшен Эксплорер есть элемент Референцес - жмакай правой кнопой - Add Reference Там вкладка Browse. Вот и выбирай свою dll.
Потом в проекте C# пишешь так:
Код:
using System;
using System.Text;
using System.Windows.Forms;
using EnigmaLib;

namespace TextEncoder
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        EnigmaLib.EnigmaLibClass enig = new EnigmaLib.EnigmaLibClass();

        private void button1_Click(object sender, EventArgs e)
        {
            string deText = tbxIOText.Text; // текст для шифрования
            string deKey = tbxKey.Text;     // ключ

            tbxIOText.Text  =   (string)enig.AsciiTextEncode(deText,deKey);
        }
    }
}
P.S. EnigmaLib.EnigmaLibClass - сначала имя библиотеки, потом имя класса
Если помог, жми спасибо

Последний раз редактировалось G-Kyller; 26.09.2011 в 12:23.
G-Kyller вне форума Ответить с цитированием
Старый 26.09.2011, 12:06   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
Public Class EnigmaLibClass
Это говорит о том, что твой метод принадлежит классу. То есть по-человечески нужно создать экземпляр данного класса и только потом воспользоваться его методом. Так что ИДЕ права на 100%, я тебя еще бы и обматерил на ее месте.

Цитата:
но IDE не выводит её в автоматической подстановке.
Я вот хочу запустить винчестер и прочесть файл, не включая компьютер в розетку, но не выходит . А еще проктолог отказывается дергать зубы, машина без бензина не едет, зарплату за фамилию ИТОГО не дают - список аналогий сами продолжите?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 26.09.2011 в 12:12.
Utkin вне форума Ответить с цитированием
Старый 26.09.2011, 12:42   #6
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
По умолчанию

Благодарю вас за потраченное вами время. Я сам себя хочу щас обматерить ). Разгадка скрывалась в том, что я не определил тип возвращаемой переменной в dll:
Public Function AsciiTextEncode(ByVal str As String, ByVal key As String)
Нужно вот так:
Public Function AsciiTextEncode(ByVal str As String, ByVal key As String) as string
Поэтому IDE не делала подстановку......

Я просто не смог толком объяснить, в чём именно проблема - поэтому вы меня и не поняли. Я добавлял ссылку, делал uses, создавал экземпляр... но IDE не высвечивала функцию, т.к. были ошибки в dll. Сейчас всё рабатает так:
tbxIOText.Text = encrypted.AsciiTextEncode(deText, deKey);

Но можно и так, как вы показали:
tbxIOText.Text = (string)enig.AsciiTextEncode(deText ,deKey); //без объявления в dll - As String.

Вся проблема была в том, что я не указал тип возвращаемого значения as String...
Я не знал, что можно написать так:
(string)enig.AsciiTextEncode(deText ,deKey);

Теперь буду знать.... Спасибо...
Dr.Pauliss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызвать функцию в таймере Ghennadiy Общие вопросы Delphi 3 06.06.2011 18:40
Не могу вызвать функцию (( NewKoder Общие вопросы C/C++ 4 11.12.2009 17:26
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22
как вызвать в Dll по указателю функцию, которая определена в главном потоке? SaintRain Общие вопросы Delphi 1 25.11.2006 08:27
как вызвать из Dll функцию, которая определена в главном потоке? SaintRain Win Api 1 23.11.2006 20:08