Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

nyac55

C# dołączanie biblioteki zewnętrznej do projektu? Pytania i problemy?

Polecane posty

Witam. Jak w temacie mam mały problem z dołączeniem biblioteki zewnętrznej do projektu. Mianowicie tworzę sobie Bibliotekę Klas kompiluje ją, pojawia się błąd (spowoduje to wygenerowanie pliku z rozeszerzeniem dll). Następnie tworzę Windows Forms Aplication i klikam add reference i wyszukuję projekt Biblioteki klas, gdzie szukam tego pliku z rozszerzeniem dll. Jeśli wszystko przebiegło pomyślnie w Windows Forms Aplication w kodzie behind dodaję using i podaję nazwę przestrzeni nazewniczej lub nazwę klasy z biblioteki dll, żeby się widziały.

Niestaty po wykonaniu powyższych operacji:

1. Windows Forms nie widzi funkcji, która znajduje się w klasie w bibliotece dll.

2. Nawet jeśli ustawiłem nazwę projektu Biblioteki klas na np. kalkulator, to dalej mam ClassLibrary1. Nie pomaga nawet rektoryzacja, gdyż zmienia się wszystko w obrębie Biblioteki klas, a nie także w Windows Forms Aplication.

Proszę o pomoc. Jeśli coś źle wyjaśniłem proszę pytać. Mogę także załączyć projekt w razie potrzeby.

Link do komentarza
Udostępnij na innych stronach

tworzę sobie Bibliotekę Klas kompiluje ją, pojawia się błąd (spowoduje to wygenerowanie pliku z rozeszerzeniem dll)
O ile mi wiadomo, to zazwyczaj najlepsze wyniki osiąga się wtedy, kiedy nie pojawiają się żadne błędy wink_prosty.gif
Windows Forms nie widzi funkcji, która znajduje się w klasie w bibliotece dll
Funkcja jest publiczna? I używasz jej we właściwy sposób (statyczną z klasy, niestatyczną przez obiekt)?
Nawet jeśli ustawiłem nazwę projektu Biblioteki klas na np. kalkulator, to dalej mam ClassLibrary1
R-Click na projekcie i w zakładce Application ustawiasz Assembly Name.
Link do komentarza
Udostępnij na innych stronach

O ile mi wiadomo, to zazwyczaj najlepsze wyniki osiąga się wtedy, kiedy nie pojawiają się żadne błędy wink_prosty.gif

może dla tego, że biblioteka nie jest kompilowalne ;p Kappa

Funkcja jest publiczna? I używasz jej we właściwy sposób (statyczną z klasy, niestatyczną przez obiekt)?

Utworzyłem sobie obiekt tej klasy w Windows Forms, jednak metoda klasy nie jest widoczna, po wywołaniu przez biekt.

R-Click na projekcie i w zakładce Application ustawiasz Assembly Name

Dzięki to pomogło, odnośnie nazewnictwa.

Biblioteka klas/ DLL:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace calculator_core
{
public class calculator
{
public void show()
{

}
public int licz(string znak, int a, int b)
{
Convert.ToBoolean(znak);
int wynik=0;
if (znak=="+")
wynik=a+b;
if (znak=="-")
wynik=a-b;
if (znak=="*")
wynik=a*b;
if(znak == "/")
wynik=a/b;
return wynik;
}
}
}

Windows Forms:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using calculator_core;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
calculator calc1 = new calculator();
private void m_clear_Click(object sender, EventArgs e)
{
}
private void m_read_Click(object sender, EventArgs e)
{
}
private void m_save_Click(object sender, EventArgs e)
{
}
private void m_plus_Click(object sender, EventArgs e)
{
}
private void m_minus_Click(object sender, EventArgs e)
{
}
private void backspace_Click(object sender, EventArgs e)
{
}
private void ce_Click(object sender, EventArgs e)
{
textBox1.AppendText("");
}
private void c_Click(object sender, EventArgs e)
{
textBox1.Clear();
}
private void sign_Click(object sender, EventArgs e)
{
}
private void sqrt_Click(object sender, EventArgs e)
{
}
private void seven_Click(object sender, EventArgs e)
{
textBox1.AppendText("7");
}
private void eight_Click(object sender, EventArgs e)
{
textBox1.AppendText("8");
}
private void nine_Click(object sender, EventArgs e)
{
textBox1.AppendText("9");
}
private void divide_Click(object sender, EventArgs e)
{
}
private void procent_Click(object sender, EventArgs e)
{
}
private void four_Click(object sender, EventArgs e)
{
textBox1.AppendText("4");
}
private void five_Click(object sender, EventArgs e)
{
textBox1.AppendText("5");
}
private void six_Click(object sender, EventArgs e)
{
textBox1.AppendText("6");
}
private void multiplication_Click(object sender, EventArgs e)
{
}
private void one_divide_x_Click(object sender, EventArgs e)
{
}
private void one_Click(object sender, EventArgs e)
{
textBox1.AppendText("1");
}
private void two_Click(object sender, EventArgs e)
{
textBox1.AppendText("2");
}
private void three_Click(object sender, EventArgs e)
{
textBox1.AppendText("3");
}
private void minus_Click(object sender, EventArgs e)
{
}
private void equals_Click(object sender, EventArgs e)
{
calc1.licz('+', 1, 2);
}
private void zero_Click(object sender, EventArgs e)
{
textBox1.AppendText("0");
}
private void dot_Click(object sender, EventArgs e)
{
}
private void plus_Click(object sender, EventArgs e)
{
//calc1.show("+",1,2);
}
}
}

Na razie mam coś takiego i odwołując się poprzez obiekt, już widzę, że funkcja licz dla przykładu nie jest widoczna :(

Link do komentarza
Udostępnij na innych stronach

może dla tego, że biblioteka nie jest kompilowalne ;p Kappa
Tzn? To że nie da się jej uruchomić wcale nie oznacza, że nie da się jej skompilować.

Jeżeli przy kompilacji pojawiają się jakieś błędy, to się nimi pochwal. A jeżeli przebiega bezproblemowo, to tylko zadbaj o to, żeby Formsowy projekt miał dostęp do najnowszej wersji tej dllki.

Tak swoją drogą, jeżeli klasa calculator ma odpowiadać za logikę, to jakoś ciężko mi zrozumieć sens istnienia w niej metody nazwanej show.

Link do komentarza
Udostępnij na innych stronach

@Webtom, masz rację. Tzn. teraz przy kompilacji nie ma błędu na początku raz był, ale możne coś było nie tak wtedy, teraz błąd pojawia się tylko na deklaracji obiektu w Windows Forms. Co do metody show() napisałem ją tylko dla przykładu, już kiedyś robiłem podobny kalkulator tylko, że w odwrotnej notacji polskiej i teraz chciałbym go wykonać bez tego. Tak więc show jest tylko przykładem, gdyż to co będzie zwracane leci tylko do Windows Form.

Mój obiekt dalej nie jest widoczny.


Error 1 'calculator_core.calculator' does not contain a definition for 'licz' and no extension method 'licz' accepting a first argument of type 'calculator_core.calculator' could be found (are you missing a using directive or an assembly reference?) c:\users\patryk\documents\visual studio 2013\projects\calculator_interface\windowsformsapplication1\form1.cs 145 19 WindowsFormsApplication1

Jeszcze chcę zapytać czy:

Mając metodę typu

void licz()

, mogę jakoś zwrócić z niej tekst wypisując go... tzn. jak było np. w aplikacjach konsolowych

Console.Writeline("tekst");

Jest jakiś odpowiednik, aby to zrobić? Chciałbym to wypisać np. w textBoxie.

Link do komentarza
Udostępnij na innych stronach

Mój obiekt dalej nie jest widoczny.


Error 1 'calculator_core.calculator' does not contain a definition for 'licz' and no extension method 'licz' accepting a first argument of type 'calculator_core.calculator' could be found (are you missing a using directive or an assembly reference?) c:\users\patryk\documents\visual studio 2013\projects\calculator_interface\windowsformsapplication1\form1.cs 145 19 WindowsFormsApplication1

IMHO Twój Formsowy projekt widzi jakąś starą wersje dllki.
Mając metodę typu
void licz()

, mogę jakoś zwrócić z niej tekst wypisując go... tzn. jak było np. w aplikacjach konsolowych

Console.Writeline("tekst");

Jest jakiś odpowiednik, aby to zrobić? Chciałbym to wypisać np. w textBoxie.

Chyba najlogiczniej byłoby go coś jako rezultat wywołania funkcji, ewentualnie przez pola lub propertiesy. W przekazywanie kontrolek raczej bym się nie bawił.

Ewentualnie możesz się zainteresować różnymi wariantami metody Show z klasy MessageBox.

Link do komentarza
Udostępnij na innych stronach


Chyba najlogiczniej byłoby go coś jako rezultat wywołania funkcji, ewentualnie przez pola lub propertiesy. W przekazywanie kontrolek raczej bym się nie bawił.
Ewentualnie możesz się zainteresować różnymi wariantami metody Show z klasy MessageBox.

Mógłbyś podać tzn. napisać mi ze 3 proste przykłady na to co tutaj opisujesz? Byłbym wdzięczny wink_prosty.gif (+ewentualnie opisać co to robi i jak działa)

_+_+_+_+_

Co do mojego projektu, stworzę go od nowa i sprawdzę, bo coś mi się buguje tak jak to opisujesz sad_prosty.gif

_ _ _ _ _ _ _ _

Zrobiłem projekt ponownie i widzi mi tą metodę ;) "f@cking logic"

Link do komentarza
Udostępnij na innych stronach

Rezultat wywołania funkcji (oczywiście możesz zwracać nie tylko pojedynczą wartość, ale też cały zestaw, czy to z użyciem jakiejś dodatkowej klasy/struktury, czy choćby przez obiekt klasy Tuple):

public string licz()
{
(właściwy kod)
return "rezultat";
}

textBox.Text = obiekt.licz();

Pole/property:

public string wartosc { get; private set; } // jakbyś chciał przez pole, to po prostu podmieniasz klamry z zawartością na średnik
// w tym przypadku jedyną zaletą użycia property jest uniemożliwienie modyfikowania wartości z poza klasy, ale tak generalnie property mają "nieco" większą funkcjonalność
public void licz()
{
(właściwy kod)
wartosc = "rezultat";
}

obiekt.licz();
textBox.Text = obiekt.wartosc;

Z przekazaniem kontrolki:

public void licz(TextBox textBox)
{
(właściwy kod)
textBox.Text = "rezultat";
}

obiekt.licz(textBox);

Przez parametr wyjściowy:

public void licz(out string wartosc)
{
(właściwy kod)
wartosc = "rezultat";
}

string wartosc;
obiekt.licz(out wartosc);
textBox.Text = wartosc;

Przez delegat (to tak zupełnie opcjonalnie):

public void licz(Action<string> action)
{
(właściwy kod)
action("rezultat");
}

obiekt.licz(wartosc => textBox.Text = wartosc);

Z użyciem MessageBox (przydatne, jeżeli chcesz o czymś poinformować użytkownika i mieć pewność, że tego nie przegapi), choć prawdę mówiąc używanie tego rozwiązania wewnątrz dllki wydaje mi się niezbyt przemyślanym rozwiązaniem, przynajmniej o ile ona sama nie tworzy sobie jakichś okien:

public void licz()
{
(właściwy kod)
System.Windows.Forms.MessageBox.Show("rezultat");
}

obiekt.licz();

Link do komentarza
Udostępnij na innych stronach

Bardzo fajnie to i składnie ująłeś wink_prosty.gif Dzięki smile_prosty.gif

Jest tyle możliwości... Muszę sprawdzić jeszcze jak robiłem wcześniej, ale chyba robiłem to albo przez przekazanie funkcji albo przekazanie kontrolki.

- - - - - - - - -

PS. Mam jeszcze jedno pytanie. Jesteś może programistą w jakiejś firmie, bo twój talent i skill` o tym świadczy?

_+_+_

Dodatkowo piszesz:


textBox.Text = obiekt.licz();

Co oznacza właściwość Text - odnosi się do jakiejś klasy, bądź właściwości czy po prostu nazwałeś tak swojego tekstboxa zamiast np. jak jest u mnie textBox1 ??

Link do komentarza
Udostępnij na innych stronach

Jesteś może programistą w jakiejś firmie, bo twój talent i skill` o tym świadczy?
Tak. Choć nie przesadzaj z tym skillem - zdecydowana większość rozwiązań to zupełne podstawy, które wypada znać po kilku godzinach obcowania z językiem (no może poza delegatami).
Co oznacza właściwość Text - odnosi się do jakiejś klasy, bądź właściwości czy po prostu nazwałeś tak swojego tekstboxa zamiast np. jak jest u mnie textBox1 ??
Text to właściwość TextBoxa odpowiadająca za tekst wyświetlany w kontrolce. A w przykładach zamiast Twojego textBox1 jest po prostu textBox.
Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...