2011-01-21 10 views
8

Mam "Control Library Project" C++ skompilowany przy użyciu/CLR. Wewnątrz tego projektu znajduje się Kontrola użytkownika, która wywołuje natywną bibliotekę DLL. Ta kontrolka użytkownika pojawia się w projektowym pasku narzędzi tak, jak powinna, ale nie mogę przeciągnąć jej na formularz. Bez odniesienia do biblioteki DLL kontrola użytkownika może być użyta dobrze, ale z referencją otrzymuję komunikat "Nie udało się załadować elementu przybornika", gdy próbuję go użyć.Projektant Odrzucający Kontrolę użytkownika

Połączenie natywne jest funkcjonalne i nie szkodzi w żaden sposób kontroli użytkownika. Kontrola użytkownika może być dobrze widoczna w projektancie dzięki dołączeniu wywołania DLL. Również, jeśli formant zostanie dodany ręcznie do formularza i zostanie wykonany jako program, wyświetli się również w porządku.

To sprawia, że ​​podejrzewam, że problem jest tylko kwestią programu Visual Studio Designer, który musi wiedzieć, gdzie znajduje się ta natywna biblioteka DLL. Ale nie jestem pewien, jak to powiedzieć lub gdzie umieścić DLL, aby mógł go znaleźć. O ile wiem, w ustawieniach projektu nie ma możliwości odniesienia się do natywnej biblioteki DLL. Więc to ma dla mnie sens, że projektant po prostu narzeka, ponieważ nie jest w stanie tego naprawić.

Czy istnieje sposób, aby to zadziałało?

+0

Czy problem dotyczy VS 2010, czy też wersji VS 2008? Mamy podobny, paraliżujący problem, który doprowadził nas do powrotu do VS 2008 ... –

+0

Otrzymuję ten problem z VS 2008. Więc VS 2010 nie jest lepszy pod tym względem? – Nicholas

+0

Myślałem, że dodanie natywnej biblioteki DLL do ścieżki C: \ Windows \ System32 może się powieść, ale niestety tak nie jest. – Nicholas

Odpowiedz

8

Niestety, napotkano "błąd z projektu" w VS (lub innymi słowy, "cecha").

Twoje podejrzenie, że problem polega na tym, że projektant Visual Studio musi wiedzieć, gdzie znajduje się natywna biblioteka DLL, to częściowo z prawej strony. Nie jest to kwestia niewiedzy o jego lokalizacji, ale raczej fakt, że projektant nie może odzwierciedlić złożonych zestawów trybów (zawierających zarówno kod zarządzany i natywny) w celu utworzenia instancji kontrolnej. Powoduje to, że przybornik pokazuje błąd, który zanotowałeś.

Obejście polega na kompilacji plików źródłowych C++ za pomocą /clr:pure w celu utworzenia czysto zarządzanego pliku EXE.


Inną możliwością (również "błędem według projektu" w VS) jest to, że kontrolka, którą próbujesz dodać, została skompilowana jako składnik 64-bitowy. Ponieważ Visual Studio jest procesem 32-bitowym, może wykonywać tylko 32-bitowe moduły. Chociaż pozwala dodać odniesienie do zespołu 64-bitowego, to w rzeczywistości JIT nie może skompilować tego 64-bitowego zestawu i wykonać go w procesie.

Sposób obejścia tego problemu polega na kompilacji zestawu sterowania użytkownika za pomocą ustawienia "AnyCPU", co spowoduje, że będzie on wykonywany jako proces 32-bitowy w środowisku 32-bitowym, a proces 64-bitowy w 64-bitowym trochę środowiska. Naprawdę, jest to najlepsze z obu światów, zakładając, że napisałeś swój kod poprawnie.


Wreszcie, jeśli żadna z tych prac, zawsze istnieje możliwość omijania projektanta.Nadal można napisać kod niezbędny do utworzenia polecenia użytkownika i ustawienia jego właściwości w inicjatorze formularza. Wszystko, co tracisz, to możliwość użycia kontrolki wewnątrz projektanta w Visual Studio. Wszystko działałoby zgodnie z oczekiwaniami w czasie wykonywania.

+0

Podczas tworzenia wersji x64 i x86 tego kodu, już wyizolowałem problem z platformą x64, o którym wspomniałeś, jako że nie stanowi on problemu. – Nicholas

+0

Również z powodu tego problemu projektanta już pomijam projektanta i ręcznie tworzyłem formanty formularza. – Nicholas

+0

Zgadzam się, że kompilacja z flagą/clr: pure prawdopodobnie omijałaby tutaj problem projektanta, niestety w tym przypadku potrzebuję zespołu trybu mieszanego. Jednak, moim zdaniem, projektant nie powinien zastanawiać się nad funkcją, która używa natywnej biblioteki DLL, jeśli ta funkcja jest tylko funkcją klasy użyteczności, której projektant nie wywołuje. – Nicholas

0

warte spróbować:

VS2010: skopiuj dll do folderu Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies.

VS2008, VS2010: skopiuj plik dll do folderu AppData\Local\Microsoft\VisualStudio\<version>\ProjectAssemblies\.

+0

Używam VS2008, więc nie można pracować z pierwszą opcją. Druga opcja nie działa zgodnie z opisem. Folder "ProjectAssembly" jest wypełniany tylko losowo nazwanymi folderami. Wydaje się, że foldery te są generowane automatycznie przez projektanta dość często. Zbyt często do testowania, ponieważ Visual Studio tworzy nowy folder za każdym razem, gdy coś robię. Folder ProjectAssemblies wygląda teoretycznie jak potencjalny kandydat, ale losowe nazwanie folderów sprawia, że ​​nie jest to praktyczne. – Nicholas

0

Wydaje mi się, że kontrola z odwołaniem do natywnej biblioteki DLL nie działa, ponieważ program Visual Studio nie może go załadować. Spróbuj ustawić zmienną środowiskową PATH globalnie lub po uruchomieniu programu Visual Studio. Jeśli to nie pomoże, spróbuj debugować zachowanie czasu projektowania kontrolki i powinieneś być w stanie zlokalizować problem.

+0

Próbowałem tego ukryć, umieszczając natywną bibliotekę DLL w ścieżce C: \ Windows \ System32 zgodnie z powyższymi komentarzami. Czy to nie oznacza, co masz na myśli? – Nicholas

+0

@Nicholas: Spróbuj również zarejestrować swoją bibliotekę DLL - http://www.delphifaq.com/faq/windows_user/f668.shtml –

+0

Nie ma nic wspólnego ze ścieżką do biblioteki DLL lub nie działałaby w trybie czas.Poza tym nie trzeba rejestrować niczego poza bibliotekami DLL COM/ActiveX. Nie ma sensu (i w rzeczywistości nie jest to pożądane) rejestrowanie bibliotek DLL, które eksportują tylko funkcje używane przez twoją aplikację. –

1

Znalazłem, że wygląda podobny problem?

https://connect.microsoft.com/VisualStudio/feedback/details/388107/winforms-designer-fails-to-load-managed-dll-having-unmanaged-dependencies#details

Więc MS wydają się być oficjalnie mówiąc upgrade z VS2008 do VS2010 jako obejście.

Czy kiedykolwiek znalazłeś inne rozwiązanie?

To jest problem, którego doświadczam teraz w VS2008 z projektem zarządzanym w C# .net przy użyciu zarządzanego projektu C++ przy użyciu niezarządzanego projektu C++.

Z pewnością przypomina to tymczasowe złożenia projektanta używane przez program Visual Studio - ładuje on wykryty zespół składni zależności do folderu tymczasowego, ale nie do niezarejestrowanych zależności tego zespołu. Widzę, że jest to w C: \ Users \ Username \ AppData \ Local \ Microsoft \ VisualStudio \ 9.0 \ ProjectAssembly. Podczas próby załadowania projektanta tworzony jest nowy folder z zarządzaną biblioteką DLL, ale nie niezarządzanymi zależnościami. Niestety nie mogę zrozumieć, co osoba, o której mowa w powyższym linku Microsoft mówi, jest obejściem za pomocą $ (TargetDir).

+0

W rzeczywistości znalazłem, jeśli dodaję folder ze wszystkimi zależnymi bibliotekami DLL do mojej zmiennej środowiskowej Windows PATH, a projektant Forms robi to dobrze. Teraz muszę się przekonać, czy istnieje bardziej elegancki sposób niż posiadanie ścieżki abosulte, więc inni deweloperzy w zespole nie muszą się martwić. –

3

Połącz bibliotekę z opcją /DELAYLOAD:"twoja_nazwa.dll ". To rozwiązało dla mnie ten sam problem.

0

Miałem problem podobny do tego, który może być taki sam jak twój (kto wie, ile rzeczy może być przyczyną tego?), W zasadzie, że nie mogłem zrzucić kontroli na projektanta, ale istniejące kontrole działały dobrze zarówno w produkcji, jak i testowaniu.

Dla przypomnienia, oto moja rozwiązanie:

1) Zmień ustawienia rozwiązaniem x86. To pozwoliło mi umieścić kontrolę nad projektantem, przenieść go itp. 2) Po zakończeniu możesz powrócić do AnyCPU lub x64. Naprawdę używam tylko projektanta, aby uprościć ustawienie kilku wartości, i wygląda na to, że cała sprawa 32/64 bitowa powoduje problemy.

Powiązane problemy