2012-05-02 12 views
6

Tôi có một tập tin Managed C++ mà tôi đang tham khảo từ một dự án C#. Dự án C# sẽ được biên dịch thành AnyCPU. Có cách nào để biên dịch một phiên bản 32-bit và 64-bit của tập tin Managed C++ và sau đó nói cho dự án C# tại thời gian chạy để tải đúng phiên bản tùy thuộc vào kiến ​​trúc đang chạy?Quản lý C++ và AnyCPU

Trả lời

3

This article thảo luận một cách phức tạp để thực hiện điều đó và xem nhận xét của Stefan thảo luận về một phương pháp đơn giản hơn nhiều áp dụng cho một số ứng dụng.

1

Tôi không biết làm thế nào để bạn tham khảo 'dll C++ (tham chiếu assembly P/Invoke vs .net) nhưng dù sao bạn cũng có thể trao đổi hai phiên bản của .dll lúc cài đặt.

1

Bí quyết để dll AnyCPU phát với dll C++, là lúc chạy đảm bảo rằng assembly không thể tải dll C++ và sau đó đăng ký sự kiện AppDomain AssemblyResolve. Khi lắp ráp cố gắng tải dll và thất bại, sau đó mã của bạn có cơ hội để xác định dll cần phải được nạp.

Đang đăng ký cho sự kiện này trông giống như sau:

System.AppDomain.CurrentDomain.AssemblyResolve += Resolver; 

handler cho sự kiện trông giống như sau:

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; 
} 

Tôi đã tạo ra một dự án đơn giản chứng minh làm thế nào để truy cập vào C++ chức năng từ một dll AnyCPU .

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

+0

Tò mò tại sao tôi nhận được phiếu bầu cho nhận xét này? –

+0

Tôi cũng thế. Tôi không chắc liệu tôi có làm được điều này trong sản xuất hay không, nhưng đây ít nhất là một ý tưởng khả thi. Upvoted trở lại số không để hoàn nguyên sự bất công –

+0

Cảm ơn Ivan! Tôi đánh giá cao sự hỗ trợ của bạn :) –