2013-04-21 12 views
10

Pracuję nad projektem C++/CLI z VS 2012 w bibliotece dynamicznej (.dll) i trybie x64.Visual Studio 2010 C++/CLI w trybie biblioteki statycznej: nie można znaleźć zespołu "mscorlib.dll"

Po przełączeniu trybu do biblioteki statycznej otrzymuję błąd poniżej.

Błąd 1 błąd C1107: nie można znaleźć zespołu "mscorlib.dll": proszę podać ścieżkę wyszukiwania zestawu przy użyciu/AI lub ustawiając zmienną środowiskową LIBPATH C: \ Depot \ Main \ Current \ Sln \ ALibraryProject \ Stdafx .cpp 1 1 ALibraryProject

próbowałem usunięcie odniesienia do pliku mscorlib.dll następnie dodanie go ponownie od:

Project> Właściwości> Ogólne> wspólne właściwości

Ale to nie pomogło. Ponieważ wiem, że VS obsługuje odniesienie do złożeń .NET, nie chcę dodawać do niego odniesienia do pliku dysku, ponieważ wydaje się to nielogiczne! Czy ktoś kiedyś się z tym zmierzył?

Odpowiedz

4

Gdybym przełączyć tryb biblioteka statyczna

To nie jest typowy błąd pojawi się podczas próby zbudować statycznych biblioteki z/CLR w życie. Musiałbym założyć, że majstrowałeś przy ustawieniach projektu, aby pozbyć się nieprzeniknionych błędów łącznika, które pojawiają się, gdy próbujesz to zrobić.

Głównym problemem jest to, że system kompilacji C++/CLI nie obsługuje bibliotek statycznych, które zawierają MSIL. Kod zarządzany nie korzysta z łącznika, a wiązanie odbywa się w środowisku wykonawczym. Co powoduje, że istotna różnica między bibliotekami statycznymi i bibliotekami DLL znika. Microsoft zdecydował się nie obsługiwać tego, ponieważ nie miało sensu go wdrażać. Niestety nie krzyczą wystarczająco głośno, gdy próbujesz to zrobić, błędy linkera, które otrzymujesz, nie dają wystarczającej wskazówki, co zrobiłeś źle. Obejścia, takie jak łączenie z ILMerge, również nie działają, nie mogą zajmować się złożonymi trybami. Scalanie natywnych sekcji kodu i związanych z nimi wpisów w tabeli relokacji jest bardzo nieoficjalna.

Należy pamiętać, że łączenie natywnych bibliotek statycznych jest w porządku. Typowy projekt C++/CLI ma tylko opakowania klasy ref, które muszą być zbudowane z użyciem/clr. Możesz wkleić dowolną ilość natywnego kodu z bibliotek do końcowego zestawu.


jestem zmuszony teoretyzować o faktycznym błędem kompilacji, zbyt wielu programistów dostać ten błąd dla inny powodu, że nie mają nic wspólnego z budowaniem bibliotek statycznych i są nękanie mnie w komentarzach .

Należy uważać, że kierowanie na inną wersję .NET niż ta, którą zainstalowałeś na swoim komputerze, jest dość niebezpieczne, szczególnie, jeśli chcesz zająć się 4.0 i masz 4.5.x zainstalowany. Kluczowym elementem pliku .vcxproj jest <TargetFrameworkVersion>. Tego nie będzie, jeśli rozpocząłeś projekt kierowany na starą wersję .NET, musisz go sam wstawić. IDE również nie obsługuje zmiany go, jeśli jest on obecny, ponownie edytowany ręcznie.

Co wystarczy, aby przekonać MSBuild do wygenerowania odpowiedniego polecenia kompilacji. Możesz sprawdzić, czy dobrze to wygląda, zajrzyj do podkatalogu * .tlog katalogu budowy debugowania dla twojego projektu. Plik cl.command.1.tlog pokazuje opcje, które zostały przekazane do kompilatora.Powinna ona zawierać:

/AI "C: \ Program Files (x86) \ referencyjny zwoje \ Microsoft \ Framework.NETFramework \ v4.0"
/FU "C: \ Program Files (x86) \ Referencje Złożenia \ Microsoft \ Framework.NETFramework \ v4.0 \ mscorlib.dll "

Zanotuj podkatalog, bardzo ważny, aby pasował do zamierzonego celu .NET. v4.0 w tym przykładzie. I bardzo, bardzo ważne, że robi to , a nie wskazuje na c: \ windows \ microsoft.net, dotychczasową lokalizację dla zestawów referencyjnych.

+0

które nie mogą być dalej od rzeczywistości. Jest on bardzo ŁATWY do scalania złożeń z natywnym kodem (choć niezbyt polecany) - zrobiłem to kilka razy, w rzeczywistości część mojego WORK zawiera natywny kod w złożeniach CLR - ale połączenie ich pozwoliło mi dodać kolejny krok konstrukcyjny którego chciałem uniknąć ... więc wybrałem tradycyjny sposób odnoszenia się do każdego zestawu osobno. – specializt

+0

... a część o C++/CLI jako "języku interopu" nie ma żadnego sensu. Metinks, musisz zrobić trochę badań wybranych tematów. (Microsoft) Interop nie ma nic wspólnego ze specyfiką języka, nie może być żadnym "językiem interopowym" - interop to w pewnym sensie BRIDGE MIĘDZY JĘZYKAMI. Proszę nie podawać swoich założeń i fantazji, tak jak to są twarde fakty ... – specializt

+1

Śpieszysz. Zamiast tego opublikuj odpowiedź. –

4

Mam ten sam problem. Posiadanie dll nie działa, ponieważ potrzebuję dostarczyć natywnego wrappera C++ dla obiektu .net, aby mógł on wypełnić interfejs cice ++ - Nie mogę użyć .net w interfejsie dll - to daje błąd kompilacji

To działało jako biblioteka statyczna w VS 2010 (z .net 4)

Niektóre z moich plików wykonywalnych i bibliotek dll, które również mają kod z/clr. Nie mają problemu. Nie próbuję stworzyć sieci Lbirary.

33

Miałem ten sam problem podczas konwersji mojego rozwiązania z kompilatora VS2010 na kompilator VS2013.

Rozwiązałem problem, zmieniając ustawienia projektu (dla projektu zawierającego zarządzany plik .cpp, który wyświetlał ten błąd) w następujący sposób: W Ustawienia projektu | C/C++ | Ogólne | Dodatkowe #using Katalogi Dodałem makro $ (FrameworkPathOverride). Przechodzi do referencyjnego katalogu zespołu dla docelowej wersji .NET, która w moim przypadku to C: \ Program Files (x86) \ Zestawy referencyjne \ Microsoft \ Framework.NETFramework \ v4.5.1

+0

To samo przydarzyło mi się podczas aktualizacji z VS2010 na VS2015. Nie jestem pewien, dlaczego konfiguracja ** Win32 ** miała już ** $ (FrameworkPathOverride) **, ale musiałem dodać ją do konfiguracji ** x64 **. – skst

0

I rozwiązał ten problem, usuwając zależność w starej i niezaktualizowanej wersji biblioteki mieszanej, która została również skonfigurowana tylko w konfiguracji debugowania, iw rezultacie zaczęła otrzymywać ten sam błąd, co twój po zmianie kodu.

Nie było łatwo go znaleźć, ponieważ błąd nie jest jasny, a zależność została ustawiona za pomocą "Dodatkowych zależności" w ustawieniach projektu.

Powiązane problemy