2011-08-12 11 views
9

Mam projekt, który obejmuje niektóre wrażliwe na wydajność macierzyste nagłówki C++, które intensywnie korzystają z szablonów. W przypadku tego projektu owijamy również nagłówki i dodajemy kod kleju, aby odsłonić funkcjonalność dla języków C# i innych .NET. Nazwiemy ten nagłówek "layout.h", a założymy, że jest to nagłówek strony trzeciej, którego nie mogę zmienić.Czy istnieje sposób na wykrycie, czy #pragma niezarządzana obowiązuje w C++/CLI?

W zespole C++/CLI trybu mieszanego stosunkowo łatwo popełnić błąd i #zmienić z miejsca w kodzie, w którym #pragma niezarządzana (lub #pramga zarządzana (push, off)). Kiedy tak się dzieje, szablony generują IL, a ja uzyskuję dodatkowe zarządzane/niezarządzane przejścia podczas działania kodu, a wydajność spada.

Moje pytanie brzmi: czy jest sposób, w jaki mogę wykonać test w czasie kompilacji tuż przed #include, aby kompilacja nie powiodła się, jeśli jestem przypadkowo # uwzględnienie z niewłaściwego kontekstu.

// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr 
    ASSERT_UNMANAGED() 
    #include <layout.h> 

Mój naiwny 1. podejściu sprawdzone #ifdef _MANAGED, ale to jest zawsze określona, ​​czy jestem w #pragma niekontrolowana bloku kodu, czy też nie.

+0

+1: Interesujące pytanie. – leppie

+0

To jest naprawdę trudne. Mogę wymyślić tuzin różnych sposobów implementacji 'ASSERT_MANAGED', ale' ASSERT_UNMANAGED' ma mnie zakłopotany. – ildjarn

+0

na wszelki wypadek, gdy na co patrzysz, _MANAGED, __CLR_VER i __cplusplus_cli nie mają wpływu #pragma managed/#pragma ummanaged, tam zakresy są całą jednostką kompilującą. –

Odpowiedz

1

Możesz napisać kod ASSERT_MANAGED lub ASSERT_UNMANAGED, który używałby konstruktu, który jest dostępny TYLKO podczas kompilowania zarządzanego lub niezarządzanego. Deklaracja ref class jest przykładem, który jest dostępny tylko podczas korzystania z managed.

To jest trochę brudne rozwiązanie, ale zadziała.

+1

Deklaracje klasy ref -do- działają podczas pisania ASSERT_MANAGED(). Sztuką jest znalezienie legalnego C++, który nie jest legalny C++/CLI, aby umożliwić pisanie bloku ASSERT_UNMANAGED() –

+2

Inny konkurent używa stałego łączenia ciągów, jeśli działa, jest to kod CLI (System :: String), w przeciwnym razie jest rodzimy kod. Nadal próbuję więcej w tym! – Ajay

+0

Myślałem o void __fastcall foo(); Tak naprawdę nie działa, jest to błąd kompilatora. –

1

Dyrektywy pragma należy umieścić bezpośrednio w pliku dołączanym. W ten sposób wszędzie, gdzie znajduje się plik, zadeklarowana jest sekcja niezarządzana.

Przepraszamy, musisz zmodyfikować plik dołączania.

Powiązane problemy