2012-05-02 7 views
6

Mam zarządzaną bibliotekę C++, do której odwołuję się z projektu C#. Projekt C# zostanie skompilowany jako AnyCPU. Czy istnieje sposób na skompilowanie 32-bitowej i 64-bitowej wersji biblioteki DLL Managed C++, a następnie powiadomienie projektu C# w środowisku uruchomieniowym, aby załadowało poprawne, w zależności od architektury, która jest uruchamiana?Zarządzane C++ i AnyCPU

Odpowiedz

3

omawia złożony sposób na to, i zobacz komentarz Stefana, który omawia znacznie prostsze metody, które mają zastosowanie do niektórych aplikacji.

1

Nie wiem jak "odwołać się" do biblioteki dll C++ (P/Invoke vs .net assembly reference), ale w dowolny sposób można zamienić dwie wersje pliku .dll w czasie instalacji.

1

Podstęp do pobrania biblioteki DLL AnyCPU do gry przy użyciu biblioteki dll C++ jest w trakcie wykonywania, upewnij się, że zespół nie może załadować biblioteki dll C++, a następnie zasubskrybuj zdarzenie AppDomain AssemblyResolve. Kiedy zespół próbuje załadować bibliotekę DLL i się nie powiedzie, twój kod ma możliwość określenia, która biblioteka DLL musi zostać załadowana.

Zapisywanie się na razie wygląda mniej więcej tak:

System.AppDomain.CurrentDomain.AssemblyResolve += Resolver; 

obsługi zdarzeń wygląda mniej więcej tak:

System.Reflection.Assembly Resolver(object sender, System.ResolveEventArgs args) 
{ 
    string assembly_dll = new AssemblyName(args.Name).Name + ".dll"; 
    string assembly_directory = "Parent directory of the C++ dlls"; 

    Assembly assembly = null; 
    if(Environment.Is64BitProcess) 
    { 
      assembly = Assembly.LoadFrom(assembly_directory + @"\x64\" + assembly_dll); 
    } 
    else 
    { 
      assembly = Assembly.LoadFrom(assembly_directory + @"\x86\" + assembly_dll); 
    } 
    return assembly; 
} 

Stworzyłem prosty projekt pokazujący, jak uzyskać dostęp do C++ funkcjonalność z dll AnyCPU .

https://github.com/kevin-marshall/Managed.AnyCPU

+0

Ciekawe, dlaczego dostałem głos w dół za ten komentarz? –

+0

Ja też. Nie jestem pewien, czy zrobiłbym to w produkcji, ale jest to przynajmniej sensowny pomysł. Wycofane z powrotem do zera, aby przywrócić niesprawiedliwość –

+0

Dzięki Ivan! Doceniam twoje wsparcie :) –

Powiązane problemy