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.
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
... 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
Śpieszysz. Zamiast tego opublikuj odpowiedź. –