Silverlight има какво да предложи (все още), макар и все по-малко и все по-трудно. Едно от предимствата достъпни във версия 5, които може да се използва е връзка с хардуер/ COM/ native call в браузър. Отделен е въпроса “защо” и “кой” би искал да се направи по този начин. Във всеки случай, ако сте стигнали дотам има няколко gotchas, които е хубаво да се знаят.
За да имате достъп до файлова система, хардуер и т.н., applet-а е нужно да е с повишени права, което става от настройките на проекта : Require elevated trust when running in-browser. Всичко работи идеално, ако аплета се хоства в localhost или 127.0.0.1 – в момента, който се изпълнява в Internet/ Local Internet всичко изведнъж се скапва и се получава грешки от рода на
1 |
This operation is not supported in the current context |
За да работи нормално и тук са необходими няколко стъпки:
- аплетът трябва да е подписан (настройки на проекта – Signing)
- горния сертификат трябва да присъства в Trusted Publishers на всички клиентски компютри (!!!)
- ако е self-signed, то разбира се трябва да присъства и в Trusted Root authorities
- в Registry на всяка клиентска машина е необходимо да се позволи изпълнението на аплети с повишени права в бразуър (ако се изпълнява out-of-browser това не е необходимо).
Необходимите ключове, които търпят промяна са
1 2 3 4 5 6 7 |
64bit [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Silverlight] "AllowElevatedTrustAppsInBrowser"=dword:00000001 32bit [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Silverlight] "AllowElevatedTrustAppsInBrowser"=dword:00000001 |
както е описано в MSDN.
Не измислих нищо по-добро от проверка дали аплета върви с повишени права с
1 |
Application.Current.HasElevatedPermissions |
и ако не – да прехвърля към страница с допълнителна информация как да се разреши проблема. А именно еднократно изпълнение на изпълним файл (по-добри идеи?), който променя настройките в Registry и инсталира нужните сертификати.
За инсталиране на сертификатите може да се използва например:
1 2 3 4 5 6 7 8 9 10 |
private static void InstallCERCertificate(string cerData, StoreName storeName) { byte[] data = Convert.FromBase64String(cerData); X509Certificate2 certificate = new X509Certificate2(data); X509Store store = new X509Store(storeName, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadWrite); store.Add(certificate); store.Close(); } |
а за настройките в registry:
1 2 3 4 5 6 7 |
Microsoft.Win32.RegistryKey key; try { key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"Software\Wow6432Node\Microsoft\Silverlight", true); key.SetValue("AllowElevatedTrustAppsInBrowser", 1, Microsoft.Win32.RegistryValueKind.DWord); key.Close(); } catch { } |