2005: msvcr80.dll Visual C++ 2005 Redistributable Package (x86) http://www.microsoft.com/downloads/en/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE Visual C++ 2005 Redistributable Packager (x64) http://www.microsoft.com/downloads/en/details.aspx?FamilyID=eb4ebe2d-33c0-4a47-9dd4-b9a6d7bd44da 2008: msvcr90.dll Microsoft Visual C++ 2008 Redistributable Package (x86) http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF Microsoft Visual C++ 2008 Redistributable Package (x64) http://www.microsoft.com/en-us/download/details.aspx?id=15336 2008 SP1: msvcr90.dll Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) http://www.microsoft.com/en-us/download/details.aspx?id=5582 Microsoft Visual C++ 2008 SP1 Redistributable Package for (x64) http://www.microsoft.com/downloads/en/details.aspx?familyid=BA9257CA-337F-4B40-8C14-157CFDFFEE4E 2010: msvcr100.dll Microsoft Visual C++ 2010 Redistributable Package (x86) http://www.microsoft.com/download/en/details.aspx?id=5555 Microsoft Visual C++ 2010 Redistributable Package (x64) http://www.microsoft.com/download/en/details.aspx?id=14632 2010 SP1: msvcr100.dll Microsoft Visual C++ 2010 SP1 Redistributable Package (x86) http://www.microsoft.com/en-us/download/details.aspx?id=8328 Microsoft Visual C++ 2010 SP1 Redistributable Package (x64) http://www.microsoft.com/en-us/download/details.aspx?id=13523 2012: msvcr110.dll Microsoft Visual C++ Redistributable for Visual Studio 2012 (3 downloads: arm, x86 and x64) http://www.microsoft.com/en-us/download/details.aspx?id=30679
الگوی MVVM - تمرین
Let’s continue our journey to learn the MVVM pattern, applied to Universal Windows apps development. After we’ve learned the basic concepts in the previous post, now it’s time to start writing some code. As already mentioned in the previous post, we’re going to leverage MVVM Light as toolkit to help us implementing the pattern: since it’s the most flexible and simple to use, it will be easier to understand and apply the basic concepts we’ve learned so far.
Eazfuscator یکی از برنامههای با کیفیت code obfuscation مخصوص دات نت فریم ورک است. این برنامه رایگان بوده و استفاده از آن به سادگی drag & drop فایل dll یا exe برنامه خود بر روی پنجره آن میباشد (یا استفاده از آن از طریق خط فرمان جهت اتوماسیون اینکار)
ویژگیهای آن:
Automatic code protection with variety of supported obfuscation techniques:
- Symbol renaming
- String encryption
- Constant literals pruning
- Method signatures overload induction
- Class hierarchy linerization
- Code control flow obfuscation
- Assemblies merging
Supports .NET Framework versions 2.0, 3.0 and 3.5
Supports .NET Compact Framework versions 2.0 and 3.5
Supports Silverlight assemblies and XAP packages
Supports XNA applications for Windows, Xbox 360 and Zune platforms
Can obfuscate any 100% managed .NET assembly
Provides revolutionally innovative and easy to use GUI interface as well as classical command line interface
Microsoft Visual Studio integration. Supported versions are Microsoft Visual Studio 2005 and 2008 including Express editions
Supports automatic builds
پ.ن.
بنابر تجربه شخصی با این ابزارها (تجاری و غیرتجاری)، این تنها برنامهای است که جهت code obfuscation اسمبلیهای ASP.Net در محیط کاری مشکل ساز نشده و سایت پس از مدتی با پیغامهای عجیب و غریب از کار نمیافتد.
شروع به کار با ODP.Net Core
var sqlDatabasePassword = pulumiConfig.RequireSecret("sql-server-nikola-dev-password"); var sqlDatabaseUserId = pulumiConfig.RequireSecret("sql-server-nikola-dev-user-id"); var resourceGroup = new ResourceGroup("rg-dds-nikola-dev", new ResourceGroupArgs { Name = "rg-dds-nikola-dev", Location = "WestUS" }); var storageAccount = new Account("storagenikoladev", new AccountArgs { Name = "storagenikoladev", ResourceGroupName = resourceGroup.Name, Location = resourceGroup.Location, AccountKind = "StorageV2", AccountReplicationType = "LRS", AccountTier = "Standard", }); var container = new Container("container-nikola-dev", new ContainerArgs { Name = "container-nikola-dev", ContainerAccessType = "blob", StorageAccountName = storageAccount.Name }); var blobStorage = new Blob("blob-nikola-dev", new BlobArgs { Name = "blob-nikola-dev", StorageAccountName = storageAccount.Name, StorageContainerName = container.Name, Type = "Block" }); var appInsights = new Insights("app-insights-nikola-dev", new InsightsArgs { Name = "app-insights-nikola-dev", ResourceGroupName = resourceGroup.Name, Location = resourceGroup.Location, ApplicationType = "web" // also general for mobile apps }); var sqlServer = new SqlServer("sql-server-nikola-dev", new SqlServerArgs { Name = "sql-server-nikola-dev", ResourceGroupName = resourceGroup.Name, Location = resourceGroup.Location, AdministratorLogin = sqlDatabaseUserId, AdministratorLoginPassword = sqlDatabasePassword, Version = "12.0" }); var sqlDatabase = new Database("sql-database-nikola-dev", new DatabaseArgs { Name = "sql-database-nikola-dev", ResourceGroupName = resourceGroup.Name, Location = resourceGroup.Location, ServerName = sqlServer.Name, RequestedServiceObjectiveName = "Basic" }); var appServicePlan = new Plan("app-plan-nikola-dev", new PlanArgs { Name = "app-plan-nikola-dev", ResourceGroupName = resourceGroup.Name, Location = resourceGroup.Location, Sku = new PlanSkuArgs { Tier = "Shared", Size = "D1" } }); var appService = new AppService("app-service-nikola-dev", new AppServiceArgs { Name = "app-service-nikola-dev", ResourceGroupName = resourceGroup.Name, Location = resourceGroup.Location, AppServicePlanId = appServicePlan.Id, SiteConfig = new AppServiceSiteConfigArgs { Use32BitWorkerProcess = true, // X64 not allowed in shared plan! AlwaysOn = false, // not allowed in shared plan! Http2Enabled = true }, AppSettings = { { "ApplicationInsights:InstrumentationKey", appInsights.InstrumentationKey }, { "APPINSIGHTS_INSTRUMENTATIONKEY", appInsights.InstrumentationKey } }, ConnectionStrings = new InputList<AppServiceConnectionStringArgs>() { new AppServiceConnectionStringArgs { Name = "AppDbConnectionString", Type = "SQLAzure", Value = Output.Tuple(sqlServer.Name, sqlDatabase.Name, sqlDatabaseUserId, sqlDatabasePassword).Apply(t => { (string _sqlServer, string _sqlDatabase, string _sqlDatabaseUserId, string _sqlDatabasePassword) = t; return $"Data Source=tcp:{_sqlServer}.database.windows.net;Initial Catalog={_sqlDatabase};User ID={_sqlDatabaseUserId};Password={_sqlDatabasePassword};Max Pool Size=1024;Persist Security Info=true;Application Name=Nikola"; }) }, new AppServiceConnectionStringArgs { Name = "AzureBlobStorageConnectionString", Type = "Custom", Value = Output.Tuple(storageAccount.PrimaryAccessKey, storageAccount.Name).Apply(t => { (string _primaryAccess, string _storageAccountName) = t; return $"DefaultEndpointsProtocol=https;AccountName={_storageAccountName};AccountKey={_primaryAccess};EndpointSuffix=core.windows.net"; }) } } }); appService.OutboundIpAddresses.Apply(ips => { foreach (string ip in ips.Split(',')) { new FirewallRule($"app-srv-{ip}", new FirewallRuleArgs { Name = $"app-srv-{ip}", EndIpAddress = ip, ResourceGroupName = resourceGroup.Name, ServerName = sqlServer.Name, StartIpAddress = ip }); } return (string?)null; });
مدرسه هوش مصنوعی
Dive in and learn how to start building intelligence into your solutions with the Microsoft AI platform, including pre-trained AI services like Cognitive Services and Bot Framework, as well as deep learning tools like Azure Machine Learning, Visual Studio Code Tools for AI, and Cognitive Toolkit. Our platform enables any developer to code in any language and infuse AI into your apps. Whether your solutions are existing or new, this is the intelligence platform to build on.
فعالسازی توزیع فایلهای PDB به همراه بستههای NuGet
وجود فایلهای PDB، برای اجرای برنامهها ضرورتی ندارند؛ اما اگر ارائه شوند، به کمک آنها میتوان گزارشهای استثناءهای بسیار کاملتری را به همراه نام فایل و شماره سطرهای مرتبط موجود در Exception.StackTrace، مشاهده کرد.
پیشتر توسعه دهندگان بستههای NuGet، فایلهای PDB را خودشان با تعریف یک سری include در فایل مشخصات بسته، به فایل نهایی تولیدی اضافه میکردند. اما این روزها با ارائهی «NuGet.org Symbol Server»، دیگر افزودن فایلهای PDB به بستههای nupkg توصیه نمیشود. چون حجم نهایی و زمان بازیابی بستهها را بیش از اندازه افزایش میدهند؛ خصوصا اگر مصرف کنندهای قصد دیباگ آنها را نداشته باشد.
راه حل جدید توصیه شده، ارائهی فایلهای ویژهی snupkg. در کنار بستههای nupkg. معمولی است که حاوی فایلهای PDB متناظر با بستهی اصلی NuGet هستند.
برای فعالسازی آنها در پروژههای NET Core. بستههای نیوگت خود تنها کافی است دو تنظیم زیر را به فایل csproj اضافه کنید:
<PropertyGroup> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat> </PropertyGroup>
در سمت مصرف کننده، IDE شما باید برای کار با این Symbol Server تنظیم شده باشد.
فعالسازی تولید Source Link
وجود PDBها جهت دیباگ بستههای ارائه شده بسیار مفیدند؛ اما اگر بر روی کدهای نهایی بهینه سازی صورت گرفته باشد، ممکن است اطلاعات دیباگ آنها با کد اصلی تطابق پیدا نکنند. برای بهبود این وضعیت و ارتقاء آن به یک سطح بالاتر، مفهوم source link ارائه شدهاست که مستقل است از نوع زبان و همچنین سورس کنترل.
کار سورسلینک، افزودن متادیتای سورس کنترل انتخابی، به بستهی نهایی تولید شدهاست. به این صورت میتوان سورس کامل و متناظر با قطعه کد بسته و کتابخانهی ثالث در حال دیباگ را در IDE خود داشت و با آن به نحو متداولی کار کرد. یعنی سورس لینک، قابلیت «Step Into" the source code"» را مهیا میکند. متادیتای اضافه شده، دقیقا مشخص میکند که بستهی تولیدی نهایی، متناظر با کدام commit سورس کنترل است. به این ترتیب دقیقا میتوان به کدهای همان commit ای که بسته بر اساس آن کامپایل شدهاست، در IDE خود دسترسی یافت.
این قابلیت از Visual Studio 15.3 به بعد در اختیار کاربران آن است (گزینهی Enable Source Server Support، در قسمت Debug/General آن باید فعال شود). همچنین Rider و VSCode نیز از آن پشتیبانی میکنند. برای Rider باید در قسمت Tools/External symbols، گزینههای Use sources from symbol files when available و Allow downloading symbols from remote locations را فعال کنید.
همچنین برای فعالسازی آن در فایل csproj بستهی نیوگت خود میتوانید تنظیمات زیر را اضافه کنید:
<PropertyGroup> <PublishRepositoryUrl>true</PublishRepositoryUrl> <EmbedUntrackedSources>true</EmbedUntrackedSources> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" /> </ItemGroup>
روش فعالسازی Source Link در پروژهی VSCode
اگر از VSCode استفاده میکنید، نیاز است تنظیمات زیر را به قسمت configurations فایل launch.json خود اضافه کنید تا قابلیت «Step Into" the source code"» بستههای نیوگتی که از SourceLink پشتیبانی میکنند، با فشردن دکمهی F11 در حین دیباگ، فعال شود:
"justMyCode": false, "symbolOptions": { "searchMicrosoftSymbolServer": true }, "suppressJITOptimizations": true, "env": { "COMPlus_ZapDisable": "1" }