Użycie metody z C# dll w app VC++

0

Witam! Piszę kilka metod w c#, które znajdą się w DLLu.
Na moje pytanie jest tyle różnych odpowiedzi wg google, że nie potrafię wybrać tej najwłaściwszej.
Mój problem to metoda która przyjmuje jako parametr
int metoda( Sbyte[] param )
typ Sbyte[] wybrałem w celu teoretycznej zgodnosci z charem c++. Udało mi się już wczytać dllkę i użyć innej metody z niej z sukcesem. Problem jest z przekazaniem napisu do metody.
Używając:

char tab[] = "nazwa"; 
metoda (tab); 

dostaję błąd "cannot convert parameter from 'char [6]' to 'cli::array<Type,dimension> ^' ". Jakiego typu w takim razie użyć w definicji metody c#-owej?
Zależy mi, by do metody w c++ (a najlepiej także w c#) typ parametru to char (wiem, że najpewniej nie da się tego jako wspólny typ).

Proszę o pomoc

1
  1. czemu char? Nie możesz użyć po prostu Sbyte w C++ (z namespace System)?

  2. char[] tab raczej niż char tab[].

0

char[] tab u mnie w VS 2010 nie działa. Zresztą, w c++ z tego co pamietam powinno byc tak jak było w pierwszym poscie (nie wywala wtedy błędu).
Spróbowałem użyć SByte w C++ - zadziałało tak samo jak char, tzn nie działa - niewłaściwa konwersja do typu cli::array<>.

Dlaczego char? Teoretycznie taki jest wymóg klienta.

1

W C++ powinno być tak, ale W C++\Cli nie. Tzn. nie wtedy kiedy łączysz się z kodem zarządzanym, bo zarządzana tablica to zupełnie co innego niż natywna tablica.

Jeśli o mnie chodzi to dość dawno temu pisałem w C++\CLI więc sorry za pomyłkę w podanej składni, zarządzane tablice się jednak inaczej deklaruje (pomyłka bierze się z tego że w C# można deklarować natywne unsafe tablice tablice tak jak w C++ więc założyłem że w C++ też można odwrotnie)

Poprawne rozwiązanie:
http://www.codeproject.com/KB/mcpp/cppcliarrays.aspx
array<char>^ strarray = gcnew array<char>(x);

Napisz czy działa (bo nie jestem pewien czy sygnatura się będzie zgadzać)?

0

Niestety, nie działa, albo już nie potrafię wykombinować prawidłowego rozwiązania. Popróbuję jeszcze jutro... Jak już odpocznę ;) Odezwę się także jutro. Na razie dzięki za pomoc.

0

Zapomniałem dodać, że template po wrzuceniu wywala, że nie ma namespace'a, albo, że nie może dziedziczyć po System::Array. Jeśli natomiast użyć samego:

 array<char,1>^ tab = gcnew array<char>(3); 

to podaje, że nie można konwertować typu cli::array<Type, dimension> do cli::array<Type, dimension>

0
  1. używaj raczej typów C++, nie jakichś Sbyte (ale patrz niżej)
  2. z jednej strony masz array<char,1>, z drugiej masz array<char>. stąd błąd.
    użyj:
array<char> ^tab = gcnew array<char>(3);

char[] tab u mnie w VS 2010 nie działa
bo powinno być

char tab[]

, ale to tablica natywna — jak stworzyć zarządzaną pokazałem wyżej.

typ parametru to char (wiem, że najpewniej nie da się tego jako wspólny typ).
Ale! typ char z C# to Char w C++/CLI.
Typ char z C++ to sbyte w C#.

1 użytkowników online, w tym zalogowanych: 0, gości: 1