Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu başlığında, bir Windows Mağazası uygulamasında çalışan yönetilen kodu analiz eden tanılama araçları yazarken düşünmeniz gerekenler açıklanmaktadır. Ayrıca, windows mağazası uygulamalarında çalıştırdığınızda çalışmaya devam edebilmeleri için mevcut geliştirme araçlarınızı değiştirmeye yönelik yönergeler de sağlar. Bu bilgileri anlamak için en iyisi Ortak Dil Çalışma Zamanı Profil Oluşturma API'sini biliyorsanız, bu API'yi Windows masaüstü uygulamalarında doğru çalışan bir tanılama aracında zaten kullandınız ve şimdi aracı Windows Mağazası uygulamalarında düzgün çalışacak şekilde değiştirmek istiyorsunuz.
Giriş
Giriş paragrafını geçtiyseniz CLR Profil Oluşturma API'sini biliyorsunuz demektir. Yönetilen masaüstü uygulamalarında iyi çalışan bir tanılama aracı yazdınız. Şimdi, aracının yönetilen bir Windows Mağazası uygulamasıyla çalışması için ne yapacağınızı merak ediyorsun. Belki de bunu zaten çalıştırmayı denediniz ve bunun basit bir görev olmadığını keşfettiniz. Aslında, tüm araç geliştiricileri için belirgin olmayan bazı önemli noktalar vardır. Örneğin:
Windows Mağazası uygulamaları ciddi ölçüde azaltılmış izinlere sahip bir bağlamda çalışır.
Windows Meta Veri dosyaları, geleneksel yönetilen modüllerle karşılaştırıldığında benzersiz özelliklere sahiptir.
Windows Mağazası uygulamalarının etkileşim kesildiğinde kendilerini askıya alma alışkanlığı vardır.
İşlemler arası iletişim mekanizmalarınız artık çeşitli nedenlerle çalışmayabilir.
Bu konu başlığı altında, bilmeniz gerekenler ve bunlarla düzgün bir şekilde nasıl başa çıkabileceğiniz listelenir.
CLR Profil Oluşturma API'sini yeni kullanıyorsanız, daha iyi giriş bilgileri bulmak için bu konunun sonundaki Kaynaklar'a atlayın.
Belirli Windows API'leri ve bunların nasıl kullanılması gerektiği hakkında ayrıntılı bilgi sağlamak da bu konunun kapsamı dışındadır. Bu konuyu bir başlangıç noktası olarak değerlendirin ve burada başvuruda bulunan Windows API'leri hakkında daha fazla bilgi edinmek için MSDN'ye bakın.
Mimari ve terminoloji
Genellikle, bir tanılama aracı aşağıdaki çizimde gösterilen gibi bir mimariye sahiptir. "Profil oluşturucu" terimini kullanır, ancak bu tür araçların çoğu tipik performans veya bellek profili oluşturmanın ötesine geçerek kod kapsamı, sahte nesne çerçeveleri, zaman yolculuğu hata ayıklaması, uygulama izleme gibi alanlara taşınır. Kolaylık olması için, bu konu tüm bu araçlara profil oluşturucu olarak başvurmaya devam edecektir.
Bu konu başlığında aşağıdaki terminoloji kullanılır:
Uygulama
Bu, profil oluşturucunun çözümlediğini uygulamadır. Genellikle, bu uygulamanın geliştiricisi artık uygulamayla ilgili sorunları tanılamaya yardımcı olmak için profil oluşturucuyu kullanıyor. Geleneksel olarak, bu uygulama bir Windows masaüstü uygulaması olurdu, ancak bu konuda Windows Mağazası uygulamalarına bakıyoruz.
Profil Oluşturucu DLL'i
Bu, analiz edilen uygulamanın işlem alanına yüklenen bileşendir. Profil oluşturucu "aracı" olarak da bilinen bu bileşen, ICorProfilerCallback ICorProfilerCallback Arabirimi(2,3 vb.) arabirimlerini uygular ve çözümlenen uygulama hakkında veri toplamak ve uygulamanın davranışının yönlerini potansiyel olarak değiştirmek için ICorProfilerInfo(2,3, vb.) arabirimlerini kullanır.
Profil Oluşturucu Kullanıcı Arabirimi
Bu, profil oluşturucu kullanıcısının etkileşimde olduğu bir masaüstü uygulamasıdır. Kullanıcıya uygulama durumunu görüntülemekten ve kullanıcıya analiz edilen uygulamanın davranışını denetleme araçları vermekten sorumludur. Bu bileşen her zaman profili oluşturulan uygulamanın işlem alanından ayrı olarak kendi işlem alanında çalışır. Profil Oluşturucu kullanıcı arabirimi, çözümlenen uygulamanın başlangıçta profil oluşturucu DLL'sinin yüklenmediği durumlarda Profil Oluşturucu DLL'sini yüklemesine neden olmak için ICLRProfiling::AttachProfiler yöntemini çağıran işlem olan "ekleme tetikleyicisi" olarak da görev yapabilir.
Önemli
Profil Oluşturucu kullanıcı arabiriminiz, Bir Windows Mağazası uygulamasını denetlemek ve raporlamak için kullanıldığında bile bir Windows masaüstü uygulaması olarak kalmalıdır. Tanılama aracınızı Windows Mağazası'nda paketleyip gönderebilmeyi beklemeyin. Aracının Windows Mağazası uygulamalarının yapamayacağı şeyleri yapması gerekir ve bunların çoğu Profil Oluşturucu kullanıcı arabiriminizde bulunur.
Bu belgenin tamamında örnek kod şunları varsayar:
ClR Profil Oluşturma API'sinin gereksinimlerine göre yerel bir DLL olması gerektiğinden, Profil Oluşturucu DLL'niz C++ dilinde yazılır.
Profil Oluşturucu kullanıcı arabiriminiz C# dilinde yazılır. Bu gerekli değildir, ancak Profil Oluşturucu kullanıcı arabiriminizin işlemi için dille ilgili bir gereksinim olmadığından, neden kısa ve basit bir dil seçmiyoruz?
Windows RT cihazları
Windows RT cihazları oldukça kilitlidir. Üçüncü taraf profil oluşturucular bu tür cihazlara yüklenemez. Bu belge Windows 8 bilgisayarlarına odaklanır.
Windows Çalışma Zamanı API'lerini kullanma
Aşağıdaki bölümlerde açıklanan bir dizi senaryoda, Profil Oluşturucu UI masaüstü uygulamanızın bazı yeni Windows Çalışma Zamanı API'lerini tüketmesi gerekir. Hangi Windows Çalışma Zamanı API'lerinin masaüstü uygulamalarından kullanılabileceğini ve masaüstü uygulamalarından ve Windows Mağazası uygulamalarından çağrıldığında davranışlarının farklı olup olmadığını anlamak için belgelere başvurmak istersiniz.
Profil Oluşturucu kullanıcı arabiriminiz yönetilen kodda yazılmışsa, bu Windows Çalışma Zamanı API'leri kullanımı kolaylaştırmak için yapmanız gereken birkaç adım vardır. Daha fazla bilgi için Yönetilen masaüstü uygulamaları ve Windows Çalışma Zamanı makalesine bakın.
Profil Oluşturucu DLL'sini yükleme
Bu bölümde, Profil Oluşturucu kullanıcı arabiriminizin Windows Mağazası uygulamasının Profil Oluşturucu DLL'nizi yüklemesine nasıl neden olduğu açıklanmaktadır. Bu bölümde açıklanan kod Profil Oluşturucu KULLANıCı Arabirimi masaüstü uygulamanıza aittir ve bu nedenle masaüstü uygulamaları için güvenli olan ancak Windows Mağazası uygulamaları için güvenli olması gerekmeyen Windows API'lerini kullanmayı içerir.
Profil Oluşturucu kullanıcı arabiriminiz, Profil Oluşturucu DLL'nizin uygulamanın işlem alanına iki şekilde yüklenmesine neden olabilir:
Uygulama başlangıcında, ortam değişkenleri tarafından denetlendiği gibi.
ICLRProfiling::AttachProfiler yöntemini çağırarak başlatma tamamlandıktan sonra uygulamaya eklenerek.
İlk engellerinizden biri, Windows Mağazası uygulamalarıyla düzgün bir şekilde çalışmak için Profil Oluşturucu DLL'nizin başlatma ve ekleme yükünü almak olacaktır. Her iki yükleme biçimi de ortak bazı önemli noktaları paylaşır, bu nedenle onlarla başlayalım.
Yüklemeleri başlatma ve ekleme konusunda sık dikkat edilmesi gerekenler
Profil Oluşturucu DLL'nizi imzalama
Windows Profil Oluşturucu DLL'nizi yüklemeyi denediğinde, Profil Oluşturucu DLL'nizin düzgün imzalandığını doğrular. Aksi takdirde yük varsayılan olarak başarısız olur. Bunu yapmak için iki yol vardır:
Profil Oluşturucu DLL'nizin imzalandığından emin olun.
Kullanıcınıza, aracınızı kullanmadan önce Windows 8 makinesine bir geliştirici lisansı yüklemesi gerektiğini söyleyin. Bu, Visual Studio'dan otomatik olarak veya komut isteminden el ile yapılabilir. Daha fazla bilgi için bkz . Geliştirici lisansı alma.
Dosya sistemi izinleri
Windows Mağazası uygulamasının Profil Oluşturucu DLL'nizi içinde bulunduğu dosya sistemindeki konumdan yükleme ve yürütme izni olmalıdır Varsayılan olarak, Windows Mağazası uygulamasının çoğu dizinde böyle bir izni yoktur ve Profil Oluşturucu DLL'nizi yüklemeye yönelik başarısız girişimler Windows Uygulaması olay günlüğünde şuna benzer bir giriş oluşturur:
NET Runtime version 4.0.30319.17929 - Loading profiler failed during CoCreateInstance. Profiler CLSID: '{xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'. HRESULT: 0x80070005. Process ID (decimal): 4688. Message ID: [0x2504].
Genel olarak, Windows Mağazası uygulamalarının diskte yalnızca sınırlı sayıda konuma erişmesine izin verilir. Her Windows Mağazası uygulaması kendi uygulama veri klasörlerine ve dosya sistemindeki tüm Windows Mağazası uygulamalarına erişim izni verilen diğer birkaç alana erişebilir. Profil Oluşturucu DLL'nizi ve bağımlılıklarını Program Dosyaları veya Program Dosyaları (x86) altında bir yere yüklemek en iyisidir çünkü tüm Windows Mağazası uygulamaları varsayılan olarak orada okuma ve yürütme izinlerine sahiptir.
Başlangıç yükü
Genellikle bir masaüstü uygulamasında, Profil Oluşturucu kullanıcı arabiriminiz gerekli CLR Profil Oluşturma API'si ortam değişkenlerini (örneğin, COR_PROFILER
, COR_ENABLE_PROFILING
ve COR_PROFILER_PATH
) içeren bir ortam bloğu başlatıp bu ortam bloğuyla yeni bir işlem oluşturarak Profiler DLL'nizin başlangıç yükünü ister. Aynı durum Windows Mağazası uygulamaları için de geçerlidir, ancak mekanizmalar farklıdır.
Yükseltilmiş olarak çalıştırmayın
İşlem A, Windows Mağazası uygulaması İşlem B'yi oluşturma girişiminde bulunursa, İşlem A yüksek bütünlük düzeyinde değil orta bütünlük düzeyinde çalıştırılmalıdır (yani yükseltilmemelidir). Bu, Profiler kullanıcı arabiriminizin orta bütünlük düzeyinde çalışması gerektiği veya Windows Mağazası uygulamasının başlatılmasını sağlamak için orta bütünlük düzeyinde başka bir masaüstü işlemi oluşturması gerektiği anlamına gelir.
Profil oluşturmak için Bir Windows Mağazası Uygulaması Seçme
İlk olarak profil oluşturucu kullanıcınıza hangi Windows Mağazası uygulamasını başlatacaklarını soracaksınız. Masaüstü uygulamaları için bir dosyaya Gözat iletişim kutusu gösterebilirsiniz ve kullanıcı bir .exe dosyası bulup seçebilir. Ancak Windows Mağazası uygulamaları farklıdır ve Gözat iletişim kutusu kullanmak mantıklı değildir. Bunun yerine, kullanıcıya seçebilecekleri Windows Mağazası uygulamalarının listesini göstermek daha iyidir.
Bu listeyi oluşturmak için sınıfını PackageManager kullanabilirsiniz. PackageManager
masaüstü uygulamaları tarafından kullanılabilen bir Windows Çalışma Zamanı sınıfıdır ve aslında yalnızca masaüstü uygulamalarında kullanılabilir.
C# dilinde masaüstü uygulaması olarak yazılan varsayımsal Profil Oluşturucu kullanıcı arabiriminden alınan aşağıdaki kod örneği, Windows uygulamalarının listesini oluşturmak için öğesini PackageManager
kullanır:
string currentUserSID = WindowsIdentity.GetCurrent().User.ToString();
IAppxFactory appxFactory = (IAppxFactory) new AppxFactory();
PackageManager packageManager = new PackageManager();
IEnumerable<Package> packages = packageManager.FindPackagesForUser(currentUserSID);
Özel ortam bloğunu belirtme
IPackageDebug Ayarlar adlı yeni com arabirimi, bazı tanılama biçimlerini kolaylaştırmak için Windows Mağazası uygulamasının yürütme davranışını özelleştirmenizi sağlar. Yöntemlerinden biri olan EnableDebugging, bir ortam bloğunu başlatıldığında Windows Mağazası uygulamasına geçirmenize ve otomatik işlem askıya alma özelliğini devre dışı bırakma gibi diğer yararlı efektlere olanak tanır. Ortam bloğu önemlidir çünkü burada, CLR tarafından Profil Oluşturucu DLL'nizi yüklemek için kullanılan ortam değişkenlerini (COR_PROFILER
, COR_ENABLE_PROFILING
ve COR_PROFILER_PATH)
) belirtmeniz gerekir.
Aşağıdaki kod parçacığını göz önünde bulundurun:
IPackageDebugSettings pkgDebugSettings = new PackageDebugSettings();
pkgDebugSettings.EnableDebugging(packageFullName, debuggerCommandLine,
(IntPtr)fixedEnvironmentPzz);
Doğru yapmanız gereken birkaç öğe vardır:
packageFullName
paketler üzerinde yinelenirken ve yakalanırkenpackage.Id.FullName
belirlenebilir.debuggerCommandLine
biraz daha ilginç. Özel ortam bloğunu Windows Mağazası uygulamasına geçirmek için kendi basit, basit hata ayıklayıcınızı yazmanız gerekir. Windows, Windows Mağazası uygulamasını askıya alır ve hata ayıklayıcınızı şu örnekteki gibi bir komut satırıyla başlatarak hata ayıklayıcınızı ekler:MyDummyDebugger.exe -p 1336 -tid 1424
burada
-p 1336
, Windows Mağazası uygulamasının İşlem Kimliği 1336 olduğu ve-tid 1424
askıya alınan iş parçacığının İş Parçacığı Kimliği 1424 olduğu anlamına gelir. Sahte hata ayıklayıcınız ThreadID'yi komut satırından ayrıştırıp bu iş parçacığını sürdürür ve sonra çıkış yapar.İşte bunu yapmak için bazı örnek C++ kodu (hata denetimi eklediğinizden emin olun!):
int wmain(int argc, wchar_t* argv[]) { // … // Parse command line here // … HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE /* bInheritHandle */, nThreadID); ResumeThread(hThread); CloseHandle(hThread); return 0; }
Bu sahte hata ayıklayıcıyı tanılama aracı yüklemenizin bir parçası olarak dağıtmanız ve ardından parametresinde bu hata ayıklayıcının
debuggerCommandLine
yolunu belirtmeniz gerekir.
Windows Mağazası uygulamasını başlatma
Windows Mağazası uygulamasını başlatma zamanı nihayet geldi. Bunu zaten kendiniz yapmayı denediyseniz CreateProcess'in Windows Mağazası uygulama işlemi oluşturma yönteminiz olmadığını fark etmiş olabilirsiniz. Bunun yerine, IApplicationActivationManager::ActivateApplication yöntemini kullanmanız gerekir. Bunu yapmak için, başlattığınız Windows Mağazası uygulamasının Uygulama Kullanıcı Modeli Kimliğini almanız gerekir. Bu da manifestoda biraz araştırma yapman gerektiği anlamına geliyor.
Paketleriniz üzerinde yineleme yaparken (daha önceki Başlangıç yükü bölümünde yer alan "Profil oluşturmak için Bir Windows Mağazası Uygulaması Seçme" bölümüne bakın), geçerli paketin bildiriminde yer alan uygulama kümesini almak istersiniz:
string manifestPath = package.InstalledLocation.Path + "\\AppxManifest.xml";
AppxPackaging.IStream manifestStream;
SHCreateStreamOnFileEx(
manifestPath,
0x00000040, // STGM_READ | STGM_SHARE_DENY_NONE
0, // file creation attributes
false, // fCreate
null, // reserved
out manifestStream);
IAppxManifestReader manifestReader = appxFactory.CreateManifestReader(manifestStream);
IAppxManifestApplicationsEnumerator appsEnum = manifestReader.GetApplications();
Evet, bir paketin birden çok uygulaması olabilir ve her uygulamanın kendi Uygulama Kullanıcı Modeli Kimliği vardır. Bu nedenle, kullanıcınıza profil oluşturması gereken uygulamayı sormak ve söz konusu uygulamadan Uygulama Kullanıcı Modeli Kimliğini almak isteyeceksiniz:
while (appsEnum.GetHasCurrent() != 0)
{
IAppxManifestApplication app = appsEnum.GetCurrent();
string appUserModelId = app.GetAppUserModelId();
//...
}
Son olarak, Artık Windows Mağazası uygulamasını başlatmak için gerekenlere sahipsiniz:
IApplicationActivationManager appActivationMgr = new ApplicationActivationManager();
appActivationMgr.ActivateApplication(appUserModelId, appArgs, ACTIVATEOPTIONS.AO_NONE, out pid);
DisableDebugging çağırmayı unutmayın
IPackageDebug Ayarlar::EnableDebugging'i çağırdığınızda, IPackageDebug Ayarlar::D isableDebugging yöntemini çağırarak kendinizden sonra temizleme sözü vermişsinizdir, bu nedenle profil oluşturma oturumu bittiğinde bunu yaptığınızdan emin olun.
Yük ekleme
Profil Oluşturucu kullanıcı arabiriminiz Profiler DLL'sini zaten çalışmaya başlamış bir uygulamaya eklemek istediğinde ICLRProfiling::AttachProfiler kullanır. Aynı durum Windows Mağazası uygulamalarında da geçerlidir. Ancak daha önce listelenen yaygın noktalara ek olarak, hedef Windows Mağazası uygulamasının askıya alınmadığından emin olun.
EnableDebugging
Başlangıç yükünde olduğu gibi IPackageDebug Ayarlar::EnableDebugging yöntemini çağırın. Ortam bloğunu geçirmek için buna ihtiyacınız yoktur, ancak diğer özelliklerinden birine ihtiyacınız vardır: otomatik işlem askıya alma özelliğini devre dışı bırakma. Aksi takdirde, Profil Oluşturucu kullanıcı arabiriminiz AttachProfiler'ı aradığında hedef Windows Mağazası uygulaması askıya alınabilir. Aslında, bu büyük olasılıkla kullanıcı artık Profil Oluşturucu kullanıcı arabiriminizle etkileşimdeyse ve Windows Mağazası uygulaması kullanıcının ekranlarından hiçbirinde etkin değilse. Windows Mağazası uygulaması askıya alınırsa, CLR'nin Profiler DLL'nizi eklemek için gönderdiği hiçbir sinyale yanıt veremeyecektir.
Bu nedenle şöyle bir şey yapmak istersiniz:
IPackageDebugSettings pkgDebugSettings = new PackageDebugSettings();
pkgDebugSettings.EnableDebugging(packageFullName, null /* debuggerCommandLine */,
IntPtr.Zero /* environment */);
Bu, hata ayıklayıcı komut satırı veya ortam bloğu belirtmediğiniz durumlar dışında başlangıç yükleme olayı için yaptığınız çağrıyla aynıdır.
DisableDebugging
Her zaman olduğu gibi, profil oluşturma oturumunuz tamamlandığında IPackageDebug Ayarlar::D isableDebugging'i çağırmayı unutmayın.
Windows Mağazası uygulamasının içinde çalıştırma
Bu nedenle Windows Mağazası uygulaması sonunda Profil Oluşturucu DLL'nizi yükledi. Artık Profil Oluşturucu DLL'nizin, hangi API'lere izin verileceği ve azaltılmış izinlerle nasıl çalıştırılacağı da dahil olmak üzere Windows Mağazası uygulamalarının gerektirdiği farklı kurallarla nasıl yürütüldüğü öğretilmelidir.
Windows Mağazası uygulama API'lerine bağlı kalma
Windows API'sine göz atarken, her API'nin masaüstü uygulamaları, Windows Mağazası uygulamaları veya her ikisi için geçerli olarak belgelendiğini göreceksiniz. Örneğin InitializeCriticalSectionAndSpinCount işlevinin belgelerinin Gereksinimler bölümü işlevin yalnızca masaüstü uygulamaları için geçerli olduğunu gösterir. Buna karşılık InitializeCriticalSectionEx işlevi hem masaüstü uygulamaları hem de Windows Mağazası uygulamaları için kullanılabilir.
Profil Oluşturucu DLL'nizi geliştirirken, bunu bir Windows Mağazası uygulaması gibi değerlendirin ve yalnızca Windows Mağazası uygulamalarında kullanılabilir olarak belgelenen API'leri kullanın. Bağımlılıklarınızı analiz edin (örneğin, denetlemek için Profil Oluşturucu DLL'nizde çalıştırabilirsiniz link /dump /imports
) ve sonra hangi bağımlılıklarınızın tamam olup olmadığını görmek için belgelerde arama yapın. Çoğu durumda, ihlalleriniz yalnızca güvenli olarak belgelenen API'nin daha yeni bir biçimiyle değiştirilerek düzeltilebilir (örneğin InitializeCriticalSectionAndSpinCount yerine InitializeCriticalSectionEx kullanılır).
Profil Oluşturucu DLL'nizin yalnızca masaüstü uygulamalarına uygulanan bazı API'leri çağırdığını ve profil oluşturucu DLL'niz bir Windows Mağazası uygulamasına yüklendiğinde bile çalışıyor gibi göründüğünü fark edebilirsiniz. Bir Windows Mağazası uygulama işlemine yüklendiğinde Profil Oluşturucu DLL'nizde Windows Mağazası uygulamalarıyla kullanım için belgelenmemiş api'leri kullanmanın riskli olduğunu unutmayın:
Bu tür API'lerin, Windows Mağazası uygulamalarının çalıştığı benzersiz bağlamda çağrıldığında çalışması garanti edilmez.
Bu tür API'ler farklı Windows Mağazası uygulama işlemlerinden çağrıldığında tutarlı çalışmayabilir.
Bu tür API'ler, Windows'un geçerli sürümündeki Windows Mağazası uygulamalarından iyi çalışıyor gibi görünebilir, ancak Windows'un gelecek sürümlerinde bozulabilir veya devre dışı bırakılabilir.
En iyi tavsiye, tüm ihlallerinizi düzeltmek ve riskten kaçınmaktır.
Belirli bir API olmadan kesinlikle yapamayacağınızı ve Windows Mağazası uygulamaları için uygun bir değiştirme bulamayabileceğinizi fark edebilirsiniz. Böyle bir durumda, en azından:
Bu API kullanımınızda canlı gün ışığını test edin, test edin, test edin.
Windows'un gelecek sürümlerinde Windows Mağazası uygulamalarından çağrılırsa API'nin aniden bozulabileceğini veya kaybolabileceğini anlayın. Bu, Microsoft tarafından uyumlulukla ilgili bir sorun olarak kabul edilmez ve kullanımınızı desteklemek öncelikli değildir.
Azaltılmış izinler
Windows Mağazası uygulama izinlerinin masaüstü uygulamalarından farklı olduğu tüm yolları listelemek bu konunun kapsamı dışındadır. Ancak Profil Oluşturucu DLL'niz (masaüstü uygulamasına kıyasla bir Windows Mağazası uygulamasına yüklendiğinde) herhangi bir kaynağa erişmeye çalıştığında davranış kesinlikle farklı olacaktır. Dosya sistemi en yaygın örnektir. Diskte belirli bir Windows Mağazası uygulamasının erişmesine izin verilen birkaç yer vardır (bkz. Dosya erişimi ve izinler (Windows Çalışma Zamanı uygulamalar) ve Profil Oluşturucu DLL'niz de aynı kısıtlamalar altında olacaktır. Kodunuzu kapsamlı bir şekilde test edin.
İşlemler arası iletişim
Bu makalenin başındaki diyagramda gösterildiği gibi, Profil Oluşturucu DLL'nizin (Windows Mağazası uygulama işlem alanına yüklenir) kendi özel işlemler arası iletişim (IPC) kanalınız aracılığıyla Profil Oluşturucu kullanıcı arabiriminizle (ayrı bir masaüstü uygulaması işlem alanında çalışan) iletişim kurması gerekebilir. Profil Oluşturucu kullanıcı arabirimi, davranışını değiştirmek için Profil Oluşturucu DLL'sine sinyaller gönderir ve Profil Oluşturucu DLL'i analiz edilen Windows Mağazası uygulamasındaki verileri profil oluşturucu kullanıcısına göndermek için profil oluşturucu kullanıcı arabirimine geri gönderir.
Profil oluşturucuların çoğunun bu şekilde çalışması gerekir, ancak Profil Oluşturucu DLL'niz bir Windows Mağazası uygulamasına yüklendiğinde IPC mekanizmalarına yönelik seçenekleriniz daha sınırlı olur. Örneğin, adlandırılmış kanallar Windows Mağazası uygulama SDK'sının bir parçası olmadığından bunları kullanamazsınız.
Ancak elbette dosyalar daha sınırlı bir şekilde de olsa hala içindedir. Olaylar da kullanılabilir.
Dosyalar aracılığıyla iletişim kurma
Verilerinizin çoğu büyük olasılıkla dosyalar aracılığıyla Profil Oluşturucu DLL ile Profil Oluşturucu kullanıcı arabirimi arasında geçiş yapacaktır. Anahtar, hem Profil Oluşturucu DLL'nizin (Windows Mağazası uygulaması bağlamında) hem de Profil Oluşturucu kullanıcı arabiriminin okuma ve yazma erişimine sahip olduğu bir dosya konumu seçmektir. Örneğin, Geçici Klasör yolu hem Profil Oluşturucu DLL'nizin hem de Profil Oluşturucu kullanıcı arabiriminizin erişebileceği bir konumdur, ancak başka hiçbir Windows Mağazası uygulama paketi erişemez (bu nedenle diğer Windows Mağazası uygulama paketlerinden oturum açtığınız tüm bilgileri korur).
Hem Profil Oluşturucu kullanıcı arabiriminiz hem de Profil Oluşturucu DLL'niz bu yolu bağımsız olarak belirleyebilir. Profil Oluşturucu kullanıcı arabiriminiz, geçerli kullanıcı için yüklenen tüm paketler arasında yinelendiğinde (daha önce örnek koda PackageId
bakın), Geçici Klasör yolunun bu kod parçacığına benzer bir kodla türetilebileceği sınıfa erişim elde eder. (Her zaman olduğu gibi, kısa süre için hata denetimi atlanır.)
// C# code for the Profiler UI.
ApplicationData appData =
ApplicationDataManager.CreateForPackageFamily(
packageId.FamilyName);
tempDir = appData.TemporaryFolder.Path;
Bu arada, Profiler DLL'niz temelde aynı şeyi yapabilir, ancak ApplicationData.Current özelliğini kullanarak sınıfına daha kolay bir şekilde ulaşabilirApplicationData.
Olaylar aracılığıyla iletişim kurma
Profil Oluşturucu kullanıcı arabiriminizle Profil Oluşturucu DLL'niz arasında basit sinyal semantiği istiyorsanız, Windows Mağazası uygulamalarının yanı sıra masaüstü uygulamaları içindeki olayları da kullanabilirsiniz.
Profil Oluşturucu DLL'nizden CreateEventEx işlevini çağırarak istediğiniz ada sahip adlandırılmış bir olay oluşturabilirsiniz. Örneğin:
// Profiler DLL in Windows Store app (C++).
CreateEventEx(
NULL, // Not inherited
"MyNamedEvent"
CREATE_EVENT_MANUAL_RESET, /* explicit ResetEvent() required; leave initial state unsignaled */
EVENT_ALL_ACCESS);
Ardından Profil Oluşturucu kullanıcı arabiriminizin bu adlandırılmış olayı Windows Mağazası uygulamasının ad alanı altında bulması gerekir. Örneğin, Profil Oluşturucu kullanıcı arabiriminiz CreateEventEx'i çağırabilir ve olay adını olarak belirtebilir
AppContainerNamedObjects\<acSid>\MyNamedEvent
<acSid>
, Windows Mağazası uygulamasının AppContainer SID'sini oluşturur. Bu konunun önceki bölümlerinden birinde, geçerli kullanıcı için yüklenen paketler üzerinde nasıl yineleme yapılacağını göstermiştir. Bu örnek koddan packageId değerini alabilirsiniz. PackageId'den aşağıdakine benzer bir kod elde edebilirsiniz <acSid>
:
IntPtr acPSID;
DeriveAppContainerSidFromAppContainerName(packageId.FamilyName, out acPSID);
string acSid;
ConvertSidToStringSid(acPSID, out acSid);
string acDir;
GetAppContainerFolderPath(acSid, out acDir);
Kapatma bildirimi yok
Bir Windows Mağazası uygulamasında çalışırken, Profil Oluşturucu DLL'niz Windows Mağazası uygulamasından çıkıldığını Profil Oluşturucu DLL'nize bildirmek için ICorProfilerCallback::Shutdown veya hatta DllMain 'in (ileDLL_PROCESS_DETACH
) çağrılmasını kullanmamalıdır. Aslında, onların asla çağrılmayacaklarını beklemeniz gerekir. Geçmişte birçok Profil Oluşturucu DLL'si bu bildirimleri önbellekleri diske boşaltmak, dosyaları kapatmak, Profil Oluşturucu kullanıcı arabirimine geri bildirim göndermek vb. için uygun yerler olarak kullanmıştı. Ancak artık Profil Oluşturucu DLL'nizin biraz farklı düzenlenmesi gerekiyor.
Profil Oluşturucu DLL'niz bilgileri günlüğe kaydetmeli. Performans nedenleriyle, toplu iş boyutu bazı eşikleri aştıkça bellekteki bilgileri toplu işleyip diske boşaltmak isteyebilirsiniz. Ancak henüz diske boşaltılmayan bilgilerin kaybolabileceğini varsayalım. Bu, eşiğinizi akıllıca seçmek isteyeceğiniz ve Profil Oluşturucu DLL tarafından yazılan eksik bilgilerle başa çıkmak için Profil Oluşturucu kullanıcı arabiriminizin sağlamlaştırılmış olması gerektiği anlamına gelir.
Meta veri dosyalarını Windows Çalışma Zamanı
Meta veri (WinMD) dosyalarının Windows Çalışma Zamanı ayrıntılarına inmek bu belgenin kapsamı dışındadır. Bu bölüm, Profil Oluşturucu DLL'nizin analiz ettiği Windows Mağazası uygulaması tarafından WinMD dosyaları yüklendiğinde CLR Profil Oluşturma API'sinin nasıl tepki verdiğiyle sınırlıdır.
Yönetilen ve yönetilmeyen WinMD'ler
Bir geliştirici yeni bir Windows Çalışma Zamanı Bileşeni projesi oluşturmak için Visual Studio kullanıyorsa, bu projenin derlemesi geliştirici tarafından yazılan meta verileri (sınıfların, arabirimlerin vb. tür açıklamaları) açıklayan bir WinMD dosyası oluşturur. Bu proje C# veya Visual Basic ile yazılmış bir yönetilen dil projesiyse, aynı WinMD dosyası bu türlerin uygulanmasını da içerir (geliştiricinin kaynak kodundan derlenen tüm IL'yi içerdiği anlamına gelir). Bu tür dosyalar yönetilen WinMD dosyaları olarak bilinir. Hem Windows Çalışma Zamanı meta verileri hem de temel alınan uygulamayı içermeleri ilginçtir.
Buna karşılık, bir geliştirici C++ için bir Windows Çalışma Zamanı Bileşeni projesi oluşturursa, bu projenin bir derlemesi yalnızca meta verileri içeren bir WinMD dosyası oluşturur ve uygulama ayrı bir yerel DLL'de derlenmiş olur. Benzer şekilde, Windows SDK'sında sevk edilen WinMD dosyaları yalnızca meta veriler içerir ve uygulama, Windows'un bir parçası olarak gelen ayrı yerel DLL'lerde derlenir.
Aşağıdaki bilgiler hem meta veri ve uygulama içeren yönetilen WinMD'ler hem de yalnızca meta verileri içeren yönetilmeyen WinMD'ler için geçerlidir.
WinMD dosyaları CLR modüllerine benzer
CLR söz konusu olduğunda, tüm WinMD dosyaları modüllerdir. Bu nedenle CLR Profil Oluşturma API'si, WinMD dosyaları yüklendiğinde Profil Oluşturucu DLL'nize ve bunların ModuleID'lerinin ne olduğunu diğer yönetilen modüllerle aynı şekilde bildirir.
Profil Oluşturucu DLL'niz ICorProfilerInfo3::GetModuleInfo2 yöntemini çağırarak ve COR_PRF_MODULE_WINDOWS_RUNTIME bayrağı için çıkış parametresini inceleyerek pdwModuleFlags
WinMD dosyalarını diğer modüllerden ayırt edebilir. (Yalnızca ModuleID bir WinMD'yi temsil ederse ayarlanır.)
WinMD'lerden meta verileri okuma
Normal modüller gibi WinMD dosyaları, Meta Veri API'leri aracılığıyla okunabilen meta veriler içerir. Ancak CLR, yönetilen kodda program yapan ve WinMD dosyasını kullanan geliştiricilerin daha doğal bir programlama deneyimine sahip olabilmesi için WinMD dosyalarını okuduğunda Windows Çalışma Zamanı türleri .NET Framework türleriyle eşler. Bu eşlemelere bazı örnekler için bkz. Windows Mağazası Uygulamaları ve Windows Çalışma Zamanı için .NET Framework Desteği.
Peki profil oluşturucunuz meta veri API'lerini kullandığında hangi görünümü alır: ham Windows Çalışma Zamanı görünümü veya eşlenmiş .NET Framework görünümü? Cevap: Size bağlı.
IMetaDataImport gibi bir meta veri arabirimi elde etmek için WinMD üzerinde ICorProfilerInfo::GetModuleMetaData yöntemini çağırdığınızda, bu eşlemeyi kapatmak için parametresindeNoTransform dwOpenFlags
kümesini seçebilirsiniz. Aksi takdirde, eşleme varsayılan olarak etkinleştirilir. Profil oluşturucu genellikle eşlemeyi etkin tutar, böylece Profil Oluşturucu DLL'sinin WinMD meta verilerinden aldığı dizeler (örneğin, tür adları) profil oluşturucu kullanıcısına tanıdık ve doğal görünür.
WinMD'lerden meta verileri değiştirme
WinMD'lerde meta verilerin değiştirilmesi desteklenmez. Bir WinMD dosyası için ICorProfilerInfo::GetModuleMetaData yöntemini çağırır ve parametresindeWrite dwOpenFlags
değerini belirtirseniz veya IMetaDataEmit gibi yazılabilir bir meta veri arabirimi isterseniz, GetModuleMetaData başarısız olur. Bu, izlemelerini desteklemek için meta verileri (örneğin AssemblyRefs veya yeni yöntemler eklemek için) değiştirmesi gereken IL-rewriting profil oluşturucuları için özellikle önemlidir. Bu nedenle önce COR_PRF_MODULE_WINDOWS_RUNTIME (önceki bölümde açıklandığı gibi) denetlemeli ve bu modüllerde yazılabilir meta veri arabirimleri istememelisiniz.
WinMD'lerle derleme başvurularını çözümleme
Birçok profil oluşturucu, izleme veya tür denetimine yardımcı olmak için meta veri başvurularını el ile çözümlemesi gerekir. Bu tür profil oluşturucuların, CLR'nin WinMD'lere işaret eden derleme başvurularını nasıl çözümlediğini bilmesi gerekir, çünkü bu başvurular standart derleme başvurularından tamamen farklı bir şekilde çözümlenir.
Bellek profil oluşturucuları
Çöp toplayıcı ve yönetilen yığın, Windows Mağazası uygulamasında ve masaüstü uygulamasında temel olarak farklı değildir. Ancak profil oluşturucu yazarlarının dikkate alınması gereken bazı küçük farklılıklar vardır.
ForceGC yönetilen iş parçacığı oluşturur
Bellek profili oluşturma yaparken, Profil Oluşturucu DLL'niz genellikle ForceGC Yöntemi yöntemini çağırmak için ayrı bir iş parçacığı oluşturur. Bu yeni bir şey değil. Ancak bir Windows Mağazası uygulaması içinde çöp toplama işlemi yapmanın iş parçacığınızı yönetilen bir iş parçacığına dönüştürmesi (örneğin, bu iş parçacığı için profil oluşturma API'sinin ThreadID'sinin oluşturulması) şaşırtıcı olabilir.
Bunun sonuçlarını anlamak için CLR Profil Oluşturma API'sinde tanımlanan zaman uyumlu ve zaman uyumsuz çağrılar arasındaki farkları anlamak önemlidir. Bunun Windows Mağazası uygulamalarındaki zaman uyumsuz çağrılar kavramından çok farklı olduğunu unutmayın. Daha fazla bilgi için neden CORPROF_E_UNSUPPORTED_CALL_SEQUENCE var blog gönderisine bakın.
İlgili nokta, profil oluşturucunuz tarafından oluşturulan iş parçacıklarında yapılan çağrıların, Profil Oluşturucu DLL'nizin ICorProfilerCallback yöntemlerinden birinin dışından yapılmış olsa bile her zaman zaman zaman uyumlu olarak kabul edilmesidir. En azından, eskiden böyle bir durum söz konusu. Artık CLR, ForceGC Yöntemine çağrınız nedeniyle profil oluşturucunuzun iş parçacığını yönetilen iş parçacığına dönüştürdü. Bu iş parçacığı artık profil oluşturucunuzun iş parçacığı olarak kabul edilemiyor. Bu nedenle CLR, söz konusu iş parçacığı için zaman uyumlu olarak nitelenenlerin daha sıkı bir tanımını zorlar; yani bir çağrının zaman uyumlu olarak nitelenebilmesi için Profil Oluşturucu DLL'nizin ICorProfilerCallback yöntemlerinden birinin içinden kaynaklanmış olması gerekir.
Bu pratikte ne anlama geliyor? Çoğu ICorProfilerInfo yöntemi yalnızca zaman uyumlu olarak çağrılabilir ve aksi takdirde hemen başarısız olur. Bu nedenle Profil Oluşturucu DLL'niz genellikle profil oluşturucu tarafından oluşturulan iş parçacıklarında (örneğin, RequestProfilerDetach, RequestReJIT veya RequestRevert'e) yapılan diğer çağrılar için ForceGC Yöntemi iş parçacığınızı yeniden kullanıyorsa, sorun yaşarsınız. DoStackSnapshot gibi zaman uyumsuz güvenli bir işlevin bile yönetilen iş parçacıklarından çağrıldığında özel kuralları vardır. (Blog gönderisine bakınProfil oluşturucu yığını yürüme: Daha fazla bilgi için temel bilgiler ve ötesi .)
Bu nedenle, Profiler DLL'nizin ForceGC Yöntemini çağırmak için oluşturduğu tüm iş parçacıklarının yalnızca GC'leri tetikleme ve ardından GC geri çağırmalarına yanıt verme amacıyla kullanılması önerilir. Yığın örnekleme veya ayırma gibi diğer görevleri gerçekleştirmek için Profil Oluşturma API'sine çağrı yapılmamalıdır.
ConditionalWeakTableReferences
.NET Framework 4.5'den başlayarak, profil oluşturucuya bağımlı tanıtıcılar hakkında daha eksiksiz bilgiler sağlayan yeni bir GC geri çağırması olan ConditionalWeakTableElementReferences vardır. Bu tanıtıcılar, GC yaşam süresi yönetimi amacıyla bir kaynak nesneden hedef nesneye etkili bir şekilde başvuru ekler. Bağımlı tanıtıcılar yeni bir şey değil ve yönetilen kodda program yapan geliştiriciler, Windows 8 ve .NET Framework 4.5'in öncesinde bile sınıfını kullanarak System.Runtime.CompilerServices.ConditionalWeakTable<TKey,TValue> kendi bağımlı tanıtıcılarını oluşturabildi.
Ancak yönetilen XAML Windows Mağazası uygulamaları artık bağımlı tanıtıcıları yoğun bir şekilde kullanıyor. Özellikle CLR, yönetilen nesneler ve yönetilmeyen Windows Çalışma Zamanı nesneleri arasındaki başvuru döngülerini yönetmeye yardımcı olmak için bunları kullanır. Bu, bellek profil oluşturucularının yığın grafiğindeki diğer kenarlarla birlikte görselleştirilebilmeleri için bu bağımlı tanıtıcılardan haberdar edilmelerinin artık her zamankinden daha önemli olduğu anlamına gelir. Profil Oluşturucu DLL'niz yığın grafiğinin tam görünümünü oluşturmak için RootReferences2, ObjectReferences ve ConditionalWeakTableElementReferences'ı birlikte kullanmalıdır.
Sonuç
Windows Mağazası uygulamalarında çalışan yönetilen kodu analiz etmek için CLR Profil Oluşturma API'sini kullanmak mümkündür. Aslında, geliştirmekte olduğunuz bir profil oluşturucu alıp belirli değişiklikler yaparak Windows Mağazası uygulamalarını hedefleyebilirsiniz. Profil Oluşturucu kullanıcı arabiriminiz, Windows Mağazası uygulamasını hata ayıklama modunda etkinleştirmek için yeni API'leri kullanmalıdır. Profil Oluşturucu DLL'nizin yalnızca Windows Mağazası uygulamaları için geçerli olan API'leri tükettiğine emin olun. Profil Oluşturucu DLL'niz ve Profil Oluşturucu kullanıcı arabiriminiz arasındaki iletişim mekanizması, Windows Mağazası uygulama API'sinin kısıtlamaları göz önünde bulundurularak ve Windows Mağazası uygulamaları için kısıtlı izinlerin farkında olarak yazılmalıdır. Profil Oluşturucu DLL'niz, CLR'nin WinMD'lere nasıl davranıldığını ve Çöp Toplayıcısı'nın davranışının yönetilen iş parçacıkları açısından nasıl farklı olduğunu bilmeli.
Kaynaklar
Ortak Dil Çalışma Zamanı
CLR'nin Windows Çalışma Zamanı ile etkileşimi
Windows Mağazası uygulamaları