Bagaimana cara mengkompilasi kode C++/CLI untuk Silverlight?

Saya memiliki perpustakaan C++/CLI yang ingin saya gunakan dalam aplikasi Silverlight. Seharusnya menulis kode untuk Silverlight dalam bahasa .NET apa pun bisa dilakukan, tetapi sejauh ini saya hanya mengetahui cara mengkompilasi C#. Silverlight tampaknya tidak dapat menggunakan DLL yang dikompilasi untuk .NET.

Saya menggunakan Visual Studio 2010 dan Silverlight 4. Satu-satunya proyek baru yang tersedia untuk Silverlight adalah proyek C#. Memindahkan kode ke C# bukanlah pilihan praktis.

Bagaimana cara mengkompilasi kode C++/CLI untuk Silverlight?


person richj    schedule 20.11.2010    source sumber
comment
Apakah C++/CLI Anda dikompilasi dengan /clr:safe?   -  person Ben Voigt    schedule 20.11.2010


Jawaban (5)


Saya pikir saya mungkin mendapatkan proyek perpustakaan kelas VS2010 C++/CLI untuk dibangun dengan referensi ke (hanya) rakitan Silverlight.

Memperbarui

Oke, itu mungkin. Tapi itu tidak bagus.

Pertama, Anda harus meyakinkan kompiler C++ untuk TIDAK memuat .NET Framework, menggunakan saklar kompiler yang tidak berdokumen. Tapi itu bukan bagian terburuknya.

  • Setel proyek C++/CLI Anda "Dukungan Runtime Bahasa Umum" ke /clr:safe
  • Selanjutnya, pada Referensi, hapus semua referensi.
  • Selanjutnya, di properti proyek C++/CLI, di bawah C++ > Command Line, masukkan /d1clr:nomscorlib /FU"C:\Program Files (x86)\Microsoft Silverlight\4.0.50917.0\mscorlib.dll"
  • Sekarang, simpan proyek dan keluar dari Visual Studio. Buka .vcxproj di editor teks, dan ubah pengaturan versi kerangka kerja. Anda ingin itu sama dengan proyek C# Silverlight:

    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>

  • Sekarang, buka kembali Visual Studio, dan bangun proyeknya. Anda akan mendapatkan kesalahan karena kompiler secara otomatis membuat file dengan #using<mscorlib> dan jalur pencarian menemukan versi .NET Framework terlebih dahulu.

    Silverlight,Version=v4.0.AssemblyAttributes.cpp(1): fatal error C1197: cannot reference 'c:\windows\microsoft.net\framework\v4.0.30319\mscorlib.dll' as the program has already referenced 'c:\program files (x86)\microsoft silverlight\4.0.50917.0\mscorlib.dll'

  • Klik dua kali kesalahan untuk membuka file yang dibuat secara otomatis. Ganti referensi tanpa jalur dengan mis. (di sinilah Anda meletakkan referensi Anda, bukan di properti proyek)

    #using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\mscorlib.dll>

    #using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\System.dll>

    #using <c:\program files (x86)\microsoft silverlight\4.0.50917.0\System.Core.dll>

  • Untungnya, kompiler membiarkan perubahan Anda tetap di tempatnya. Jadi Anda harus baik-baik saja selama tidak ada yang membersihkan direktori temp Anda.

  • Pembangunan sekarang seharusnya berhasil.

Kemudian, Anda perlu menambahkan DLL yang dibuat oleh proyek C++/CLI ke aplikasi Silverlight Anda. Perhatikan bahwa Anda tidak dapat menyiapkan referensi proyek, karena VS2010 masih belum yakin bahwa C++/CLI adalah proyek Silverlight. Jadi, Anda harus menelusuri dan menambahkan referensi sebagai file perakitan. (Dan itu tidak akan secara otomatis beralih antara Debug dan Rilis agar sesuai dengan aplikasi Silverlight).

Catatan Akhir

Saya mendapatkannya untuk menjalankan aplikasi Silverlight kosong dalam mode Debug dan berhenti di breakpoint di tengah kode C++/CLI. Juga kode C++/CLI berhasil mengembalikan nilai ke C# dan variabel lokal di C# menerima nilai yang benar. Jadi saya rasa itu berhasil.

Saya melakukan beberapa langkah lagi untuk mencoba membuat ini berhasil, namun menurut saya langkah tersebut tidak memengaruhi hasilnya. Namun, jika Anda mengalami kesalahan, beri tahu saya dan saya akan mencoba mencari tahu apa yang saya hilangkan dari jawaban ini.

person Ben Voigt    schedule 20.11.2010
comment
Rupanya komponen Visual Web Developer diperlukan... Saya akan kembali lagi nanti (lebih lama lagi). - person Ben Voigt; 21.11.2010
comment
SDK ada di sini: microsoft .com/downloads/en/ - person richj; 21.11.2010
comment
Saya akhirnya harus melakukan instalasi fitur pada VS2010 itu sendiri, lalu menambahkan microsoft.com/downloads/en/ , lalu tambahkan Runtime Pengembang saat diminta oleh VS. - person Ben Voigt; 21.11.2010
comment
Terimakasih banyak atas jawaban Anda. Saya belum pernah menemukan hal lain seperti ini selama berjam-jam mencari di web. - person richj; 22.11.2010
comment
@richj: Ya, saya sendiri tidak menemukan saklar kompiler itu. Lihat opensubscriber.com/message/dotnet-cx@discuss .develop.com/ Namun thread tersebut tidak menunjukkan cara menggunakannya, saya harus mengacaukan banyak kombinasi opsi yang berbeda agar kompilasi berhasil. Dan ketika satu file akhirnya dikompilasi, saya mengalami masalah dengan file yang dibuat secara otomatis. Apakah Anda membuatnya berfungsi dengan kode Anda? - person Ben Voigt; 23.11.2010
comment
Langkah-langkah ini akan berfungsi untuk VS2012/.NET 4.5/SL 5. Cukup ubah jalur dan atribut .vcxproj sesuai kebutuhan. Selain itu, 2012 sekarang memungkinkan Anda menambahkan CPP DLL sebagai referensi proyek langsung. Saya telah menginstal toolkit SL dan VC++ yang dapat didistribusikan ulang sebelum mencoba ini. Saya tidak perlu melakukan instalasi apa pun agar proyek dapat dibangun dan direferensikan dengan sukses. - person Esoteric Screen Name; 28.10.2013

Ben Voigt, terima kasih untuk ini, ini berhasil juga untuk saya.

Selain itu, jika kode C++ Anda melakukan sesuatu yang khusus untuk bahasa C++ (yaitu tidak sepenuhnya IL portabel) seperti menggunakan semantik tumpukan untuk array, Anda akan mendapatkan kesalahan berikut:

could not find assembly 'Microsoft.VisualC.dll' etc.

Jika Anda mengkompilasi ulang dengan .NET Framework lengkap dan kemudian membuang kode IL, Anda akan menemukan referensi ke "''.$ArrayType$$$BY06$$CB_W modopt" atau yang serupa. Ini memberitahu Anda di mana harus mengubah kode.

Saya menemukan bahwa setelah saya menginstal Silverlight SDK dan ditambahkan ke "\Program Files(x86)\Reference Assemblies" saya tidak perlu melalui semua langkah Ben Voigt, cukup mengubah file proyek saja.

Catatan lain, Anda juga bisa menggunakan:

<TargetFrameworkProfile>WindowsPhone71</TargetFrameworkProfile>

jika Anda ingin menargetkan Windows Phone (instal SDK terlebih dahulu).

person Don Fehr    schedule 07.12.2011

Silverlight tidak mendukung pustaka C++ asli, atau skenario P/Invoke apa pun karena masalah keamanan. Jika perpustakaan Anda murni .Net, Anda mungkin dapat mendekompilasinya dengan ILDASM dan mengkompilasi ulang untuk Silverlight dengan ILASM.

person Joel Lucsy    schedule 20.11.2010
comment
Terima kasih - dari apa yang saya baca sejauh ini, beberapa kode .NET MSIL dapat menyebabkan masalah pada runtime Silverlight. Mungkin patut dicoba - saya harus memeriksa cakupan pengujian unit untuk perpustakaan. - person richj; 20.11.2010

Silverlight bukanlah platform pengembangan yang kuat seperti .NET yang terintegrasi erat dengan sistem operasi. Pertama-tama silverlight seharusnya berjalan di sistem operasi apa pun, jadi tidak ada pilihan API Asli di mana pun di silverlight.

Silverlight juga tidak mendukung MSIL sepenuhnya, jadi ada banyak masalah dalam kompilasi dan kompilasi ulang di level IL.

Bisakah Anda menjelaskan lebih lanjut tentang jenis kode C++/CLI yang Anda miliki? Sebagian besar aplikasi internet Kaya (target Silverlight) tidak menyertakan komputasi berkekuatan tinggi, melainkan alternatif HTML+JS sederhana. Untuk grafis yang kuat, Anda dapat menggunakan dukungan PixelShadder dari Silverlight.

Reflektor

Alternatif yang dapat Anda lakukan adalah, Kompilasi C++/CLI Anda ke .NET DLL biasa, gunakan Reflektor untuk membongkar dan menghasilkan kode sumber C# dari dll Anda, ini mungkin tidak sempurna, tetapi sebagian besar logika Anda akan dikonversi kembali ke C#.

person Akash Kava    schedule 20.11.2010
comment
Kode C++/CLI adalah kode murni yang dikelola .NET. Ia tidak memiliki antarmuka pengguna atau grafik; itu hanya perpustakaan langsung dengan sedikit ketergantungan kecuali pada DLL tingkat sistem yang juga harus tersedia di Silverlight. - person richj; 20.11.2010
comment
@richj: Yang Anda maksud dengan DLL tingkat sistem adalah rakitan .NET yang disertakan dengan platform Silverlight? - person Ben Voigt; 20.11.2010
comment
@Ben: Ya - rakitan milik platform Silverlight. - person richj; 20.11.2010
comment
Untuk bekerja di lingkungan saya, Reflektor harus menerjemahkan dengan andal dari C++/CLI ke C# dalam proses pembuatan yang sepenuhnya otomatis. Saya tidak dapat melakukan porting satu kali pun karena perpustakaan sedang dalam pengembangan aktif. Saya akan mencobanya jika saya menemui jalan buntu dengan metode Ben Voigt. Terima kasih. - person richj; 22.11.2010

Saya dapat solusi Ben Voigt untuk bekerja dengan beberapa perubahan kecil di Visual Studio 2013 Inilah yang saya lakukan secara berbeda.

  • Bongkar proyek silverlight yang ingin Anda rujuk. Klik kanan dan pilih edit project.csproj
  • #P2#
    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
    
  • Untuk saklar kompiler /d1clr:nomscorlib Ini tidak berfungsi untuk saya. Juga referensi ke mscorlib untuk silverlight secara otomatis ditambahkan ke output yang sesuai tanpa menentukannya pada opsi baris perintah. Inilah cara saya menyiasatinya.

  • Buka proyek di Just Deompile

  • Muat Plugin Editor Majelis

  • Arahkan pohon ke referensi

  • Hapus referensi ke mscorlib non silverlight dari menu refleksil.

  • Klik kanan pada tingkat atas pohon untuk perakitan, dan simpan sebagai di bawah menu refleksil.

Saya belum menguji semua fungsinya, tetapi fungsi yang saya uji sejauh ini berfungsi seperti yang diharapkan.

Terima kasih Ben, postingan Anda telah menghemat banyak waktu saya. Saya berpikir saya harus mem-porting perpustakaan saya :)

person Duane McKinney    schedule 30.01.2014