wywołanie funkcji c# z kodu c++/cli

0

Witam
Napotkałem problem którego nie mogę rozwiązać.
Chcę wykorzystać bibliotekę DocX w projekcie C++/Cli.
Teoretycznie chyba polecenie

DocX ^ document = DocX::Create(L"nowy.docx");

powinno zadziałać. Niestety dostaję błąd kompilatora error C2661: 'Novacode::Create' : no overloaded function takes 1 arguments. Czyli jak dobrze tłumaczę to nie ma funkcji Create dla typu który podałem.
Zacząłem grzebać po google i natrafiłem aby przekonwertować typ System::String na std::string który jest zgodny z typem string dla c#

std::string stdStr = msclr::interop::marshal_as<std::string>(L"nowy.docx");
DocX ^ document = DocX::Create(stdStr);

Dalej to samo. Wydawało mi się że typ String z c++/cli to to samo co string w c# bo to ten sam typ w .NET ale okazuje się że chyba nie.
Może ktoś wie jak rozwiązać ten problem.

3

Po co ci C++ CLI? Używasz jakiejś biblioteki C++, którą chcesz użyć razem z .net-em? Moja rada, nie utrudniaj sobie życia i użyj po prostu C#.
Poza tym ty rozumiesz co robisz?
Novacode::DocX::Create wymaga stringa z .net czyli System::String, a ty pchasz tam coś z STL-a: std::string. Spróbuj tak:

DocX ^ document = DocX::Create(S"nowy.docx");
1

no overloaded function takes 1 arguments.
Czyli jak dobrze tłumaczę to nie ma funkcji Create dla typu który podałem.

Źle tłumaczysz.
Nie ma funkcji DocX::Create która by przyjmowała jeden parametr.

Zobacz w dokumentacji albo w kodzie jak wygląda definicja tej funkcji.

"marshalling" nie ma tu nic do rzeczy.

0

Faktycznie są dwie funkcje

public static DocX Create(Stream stream, DocumentTypes documentType = DocumentTypes.Document);
public static DocX Create(string filename, DocumentTypes documentType = DocumentTypes.Document);

jak widać drugi parametr jest domyślny więc go nie wstawiałem ale jak wynika z mojego przypadku przy wywołaniu z c++/cli musi on zostać też podany. Więc ten trop był dobry z błędnym tłumaczeniem błędu.
Co do przykładu

DocX ^ document = DocX::Create(S"nowy.docx");

to kompilator daje błąd
error C3921: Use of S-prefixed strings requires /clr:oldSyntax command line option
When compiling with /clr, an implicit conversion exists from string literal type to System::String^. If necessary to avoid ambiguity, cast to System::String^

Co do wątku o nadużywaniu c++/cli to oczywiście jak tylko można to oczywiście nie ma sensu bawić się w półśrodki ale ja potrzebuję powiązać kod natywny pisany w visual studio 6 z .NET. Niestety w inny sposób nie jestem w stanie tego zrobić. Zresztą miałem wątek na forum i nie dostałem odpowiedzi poza kilkoma linkami z google które nie były przydatne. Więc jeśli ktoś wywoływał funkcje z bibliotek .NET z kodu pisanego w VS6 to proszę o podzielenie się tą wiedzą.

0

Nie S"ala" tylko L"ala".

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