بهتر است از ابزارهای مرتبطتری استفاده کنید. مانند:
در ادامه قسمت قبلی روشهای زیادی جهت اضافه شدن یک ماژول به یک اسمبلی وجود دارند. اگر شما از کامپایلر سیشارپ برای ساخت یک فایل PE با جدول مانیفست استفاده میکنید، میتوانید از سوئیچ AddModule/ استفاده کنید. برای اینکه بدانیم چگونه میتوان یک اسمبلی چند فایله ساخت بیاید فرض کنیم که دو فایل سورس کد با مشخصات زیر داریم:
RUT.cs: این سورس شامل کدهایی است که به ندرت در برنامه استفاده میشود.
FUT.cs: این سورس شامل کدهایی است که به طور مکرر مورد استفاده قرار میگیرد.
ابتدا به صورت زیر کد سورسی را که به ندرت استفاده میشود، به عنوان یک ماژول جداگانه کامپایل میکنم:
csc /t:module RUT.cs
csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs
خط بالا به علت سوئیچ t:library\ فایل MultiFileLibrary.dll را ایجاد میکند. این فایل شامل جدول متادیتای مانیفست میشود و سوئیچ به آن میگوید که باید ماژول RUT.netmodule را جزئی از اسمبلی بداند. این سوئیچ به کامپایلر اعلام میکند که ارجاع این فایل در جدول FileDef و ExportedTypesDef ثبت شود.
بعد از اتمام عملیات کامپایل، مطابق شکل زیر دو فایل ایجاد میشود که فایل سمت راست شامل جدول مانیفست است. فایل RUT.netmodule شامل کد IL و جداول متادیتاهای مربوط به خواص و رویدادها و مواردی از این قبیل است که در این ماژول یافت میشود. فایل بعدی MultiFileLibrary.dll هست که شامل کد IL کد FUT.CS میشوذ بعلاوه جداول متادیتا مثل ماژول قبلی و جدول متادیتای مانیفست که باعث میشود به عنوان یک اسمبلی شناخته شود.
البته توجه داشته باشید که جدول مانیفست ارجاعی به نوعهای عمومی استخراج شده داخل فایل خودش ندارد، زیرا که در جداول اختصاصی خودش موجود است و در ذخیره سازی صرفه جویی میگردد.
بعد از اینکه MultiFileLibrary.dll ساخته شد، به منظور آزمایش کردن جداول متادیتا میتوانید از ابزار ILDasm.exe استفاده کنید تا ارجاع به فایل RUT.netmodule به شما ثابت شود. آنچه در زیر میبینید نمایی از جداول FileDef و ExportedTypesDef است:
همانطور که در بالا میبینید فایل RUT.netmodule با شناسهی (توکن) 0x26000001 به عنوان بخشی از اسمبلی شناخته میشود و به نوع کد IL آن اشاره میکند.
بعد از اینکه MultiFileLibrary.dll ساخته شد، به منظور آزمایش کردن جداول متادیتا میتوانید از ابزار ILDasm.exe استفاده کنید تا ارجاع به فایل RUT.netmodule به شما ثابت شود. آنچه در زیر میبینید نمایی از جداول FileDef و ExportedTypesDef است:
File #1 (26000001) Token: 0x26000001 Name : RUT.netmodule HashValue Blob : e6 e6 df 62 2c a1 2c 59 97 65 0f 21 44 10 15 96 f2 7e db c2 Flags : [ContainsMetaData] (00000000) ExportedType #1 (27000001) Token: 0x27000001 Name: ARarelyUsedType Implementation token: 0x26000001 TypeDef token: 0x02000002 Flags : [Public] [AutoLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit](00100101)
همانطور که در بالا میبینید فایل RUT.netmodule با شناسهی (توکن) 0x26000001 به عنوان بخشی از اسمبلی شناخته میشود و به نوع کد IL آن اشاره میکند.
قابل توجه افراد کنجکاو: توکنهای جداول متا، مقادیر 4 بایتی است که بایت پر ارزش آن اشاره میکند که برای یافتن آن باید به چه جدولی ارجاع کرد. مقادیر زیر این نکته را روشن میکند که هر کد ابتدایی به چه جدولی اشاره میکند:
0x01 | TypeRef |
0x02 | TypeDef |
0x23 | AssemblyRef |
0x26 | File file definition |
0x27 | ExportedType |
برای دیدن لیست کاملی از این کدها فایل Corhdr.h را که به همراه فریم ورک دات نت نصب میشود، مطالعه فرمایید. سه بایت باقیمانده هم بر اساس جدولی که به آن ارجاع شده است مشخص میگردد؛ مثلا در مثال بالا کد 0x26000001 به اولین سطر جدول File اشاره میکند. برای اکثر جدولها شماره گذاری سطرها از عدد 1 آغاز میشود نه صفر یا برای برای جداول TypeDef عموما از عدد 2 آغاز میشود.
برای اجرای اسمبلی، کامپایلر نیاز دارد که همهی فایلهای اسمبلی، نصب شده و قابل دسترس باشند و در صورتیکه شما فایل RUT.netmodule را حذف کنید کامپایلر سی شارپ خطای زیر را صادر میکند:fatal error CS0009: Metadata file 'C:\ MultiFileLibrary.dll' could not be opened—'Error importing module 'RUT.netmodule' of assembly 'C:\ MultiFileLibrary.dll'—The system cannot find the file specified'
و این خطا بدین معنی است که برای ساخت اسمبلی باید تمامی فایلها حاضر و مهیا باشند. هر کد کلاینتی که اجرا میشود آن متد را صدا میزنند. موقعی که یک متد برای اولین بار فراخوانی میشود، CLR عملیات شناسایی جهت شناسایی ارجاعات آن در پارامترها، نوع خروجی متد و متغیرهای محلی آن اجرا میکند. سپس تلاش میکند تا فایل اسمبلی ارجاع شده را که شامل مانیفست هست، بار کند. اگر نوعی که لازم داریم در همین فایل متد وجود داشته باشد، اجرای عملیات را به سمت آن آغاز میکند ولی اگر جدول مانیفست ارجاع را به فایل دیگری بدهد، آن فایل در حافظه بار شده و سپس آن نوع را در دسترس قرار میدهد.
خطوط بالا این نکته را روشن میکند که فایلهای اسمبلی را تنها موقعی در حافظه بار میکند که ارجاعی از نوع موجود در آن صدا زده شده باشد؛ یعنی اینکه در زمان اجرای برنامه، لازم نیست که همهی فایلها حاضر و مهیا باشند.
یک موضوعی رو میخواستم مطرح کنم :
طبق یکی از مقالات سری ASP.net MVC سایت با استفاده از Controller فایلهای آپلود شده رو با یک کلید ،خروجی میداد.
بنده همین موضوع رو در تکنولوژی جدید پیاده سازی کردم اما با مشکل عدم نمایش فایل یا تصویر در خروجی مواجه شدم
موجود بودن فیزیکی فایل هم در مسیر wwwroot/StaticImages/ و هم مسیر MyStaticImages/ :
اما در نمایش چه ادرس مستقیم و چه تگ <img> خطای زیر نمایش داده میشود :
هر دو مسیر تست شده با قطعه کد زیر ، اما خطا مشابه میباشد
چه این گزینه hostingEnvironment.WebRootPath_
و چه این گزینه hostingEnvironment.ContentRootPath _
طبق یکی از مقالات سری ASP.net MVC سایت با استفاده از Controller فایلهای آپلود شده رو با یک کلید ،خروجی میداد.
بنده همین موضوع رو در تکنولوژی جدید پیاده سازی کردم اما با مشکل عدم نمایش فایل یا تصویر در خروجی مواجه شدم
موجود بودن فیزیکی فایل هم در مسیر wwwroot/StaticImages/ و هم مسیر MyStaticImages/ :
و نحوه آدرس دهی :
<img src='@Url.Action("DownloadFile", "ImageHandler", new {Area = "", id = item.BaseFileGuids, imgSize = ImageHandlerController.ImgSize.M})' alt=""/>
مسیر به درستی نمایش داده شده و فایل هم پس از بررسی توسط : System.IO.File.Exists = true میباشد.
اما در نمایش چه ادرس مستقیم و چه تگ <img> خطای زیر نمایش داده میشود :
هر دو مسیر تست شده با قطعه کد زیر ، اما خطا مشابه میباشد
چه این گزینه hostingEnvironment.WebRootPath_
و چه این گزینه hostingEnvironment.ContentRootPath _
public IActionResult DownloadFile([FromRoute]string id, [FromQuery] ImgSize imgSize) { var result = _baseFileService.GetFileNameAndFileNameOnDsAndFileType(id); if (result == null) return View("Error"); var fileName = result.Item1; string userAgent = Request.Headers["User-Agent"]; if (IsInternetExplorer(userAgent)) { var htencode = HtmlEncoder.Create(); var attachment = string.Format("attachment; filename=\"{0}\"", htencode.Encode(fileName)); _httpContext.HttpContext.Response.Headers.Add("Content-Disposition", attachment); } var rootPath = Path.Combine(_hostingEnvironment.WebRootPath, _settingsAppPathConfig.Value.ServerImagesRootPath); var filepath = Path.Combine(rootPath, imgSize.ToString().ToLower(), result.Item2); if (!System.IO.File.Exists(filepath)) { const string notFoundImage = "notFound.jpg"; var notFoundpath = Path.Combine(rootPath , notFoundImage); string contentType; new FileExtensionContentTypeProvider().TryGetContentType(notFoundImage, out contentType); return File(notFoundpath, contentType, notFoundImage); } string contentTypebase; new FileExtensionContentTypeProvider().TryGetContentType(result.Item3, out contentTypebase); return File(filepath, contentTypebase, fileName); }
نظرات مطالب
امکان ساخت قالب برای پروژههای NET Core.
برای عزل آن یا از نام بستهی NuGet استفاده کنید و یا مسیر کامل پوشهای که فایل template.config در آن قرار دارد:
dotnet new -u <NUGET_PACKAGE_ID> dotnet new -u <ABSOLUTE_Path to template.config folder>
IIS6 فایلهایی را که نشناسد، سرو نخواهد کرد. بنابراین اگر یکی از کاربران مثلا یک فایل docx آفیس 2007 را آپلود کرده باشد، به محض کلیک بر روی لینک دریافت فایل، با خطای زیر متوقف خواهد شد:
HTTP Error 404 - File or directory not found
فایل بر روی سرور موجود است اما کاربر قادر به دریافت آن نیست.
برای شناساندن فرمتهای جدید به IIS6 میتوان به یکی از دو روش زیر عمل کرد:
الف) اضافه کردن mime-type جدید از طریق کنسول IIS
ب) ویرایش کردن فایل MetaBase.xml مربوط به IIS
در هر دو روش فوق نیاز است تا با mime-type فایلهای جدید آشنا بود. برای مثال لیست کامل mime-types مربوط به فایلهای آفیس 2007 به صورت زیر است:
.docm,application/vnd.ms-word.document.macroEnabled.12
.docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotm,application/vnd.ms-word.template.macroEnabled.12
.dotx,application/vnd.openxmlformats-officedocument.wordprocessingml.template
.potm,application/vnd.ms-powerpoint.template.macroEnabled.12
.potx,application/vnd.openxmlformats-officedocument.presentationml.template
.ppam,application/vnd.ms-powerpoint.addin.macroEnabled.12
.ppsm,application/vnd.ms-powerpoint.slideshow.macroEnabled.12
.ppsx,application/vnd.openxmlformats-officedocument.presentationml.slideshow
.pptm,application/vnd.ms-powerpoint.presentation.macroEnabled.12
.pptx,application/vnd.openxmlformats-officedocument.presentationml.presentation
.xlam,application/vnd.ms-excel.addin.macroEnabled.12
.xlsb,application/vnd.ms-excel.sheet.binary.macroEnabled.12
.xlsm,application/vnd.ms-excel.sheet.macroEnabled.12
.xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltm,application/vnd.ms-excel.template.macroEnabled.12
.xltx,application/vnd.openxmlformats-officedocument.spreadsheetml.template
روش ب)
ابتدا IIS6 را stop کنید (در غیر اینصورت قادر به ذخیره سازی تغییرات نخواهید بود):
iisreset /stop
C:\WINDOWS\system32\inetsrv\MetaBase.xml
تگ مربوط به IIsMimeMap را یافته و خطوط فوق را دقیقا به همین صورتیکه ملاحظه میکنید به آن اضافه نمائید.
و در آخر IIS را راه اندازی کنید:
iisreset /start
روش الف)
این روش نیازی به stop و start وب سرور ندارد و به محض اضافه شدن، به صورت خودکار اعمال خواهد شد اما کمی طولانیتر است:
کنسول IIS را باز کنید
بر روی web sites کلیک راست کنید. (منظور بالاترین سطح ممکن است)
گزینه properties را انتخاب کرده و سپس به برگه http headers مراجعه نمائید.
در اینجا بر روی دکمه mime-types کلیک کرده و در صفحه باز شده باید تک تک موارد جدید را به صورت دستی وارد نمائید (در اینجا نیازی به ذکر نقطه مربوط به پسوند فایل نیست)
لازم به ذکر است که این نوع mime-types به IIS7 اضافه شدهاند.
استفاده کردم حق با شما بود سایت کامل لود میکنه اما در خواستهای Ajax پردازش نمیشه، یعنی این کامل شدن لود ربطی به درخواستهای ای جکس نداره، خروجی ای جکسی وجود داره توی صفحه ولی در سورس html وجود ندارد
برای استفاده لوکال در شبکه داخلی، امکان تهیه یک NuGet Server لوکال وجود داره: «Hosting Your Own NuGet Feeds». حتی شبیه به سایت گالری NuGet رو هم میشه لوکال نصب کرد؛ سورس باز است.
نظرات مطالب
تهیه خروجی RSS در برنامههای ASP.NET MVC
خروجی کتابخانه فوق، RSS استاندارد است و description دارد. مقادیر خواص کلاس FeedItem نهایتا به این خروجی نگاشت میشود.
برای نمونه این خروجی رو میتونید در سورس نهایی فید سایت مشاهده کنید.
برای نمونه این خروجی رو میتونید در سورس نهایی فید سایت مشاهده کنید.
- در سازندهی کلاس ApplicationDbContext ، به connectionString1 اشاره شده که تعریف آن در فایل web.config برنامه موجود است. به عبارتی در این مثال چنین رشتهی اتصالی تعریف شدهاست:
بنابراین بانک اطلاعاتی پیش فرض آن TestDbIdentity نام دارد (جهت اتصال به آن، برای مشاهده جداول و یا تغییر و ثبت اطلاعات). این رشته اتصالی هم مخصوص SQL Server تنظیم شدهاست که میتوانید توسط management studio و یا سایر ابزارهای مشابه، همانند قبل به آن متصل شوید.
- «در پوشه App_Data حذف کردم» ... از مثال نهایی کامل شده استفاده کنید (^) و نیازی به تکرار این مراحل نیست تا خطای یافت نشدن dbcontext را دریافت نکنید.
- برای ReCreate فقط کافی هست که بانک اطلاعاتی TestDbIdentity را drop کنید. بعد برنامه را مجددا از نو اجرا کنید. چون مراحل migrations آن به حالت خودکار تنظیم شدهاست، بانک اطلاعاتی را به صورت خودکار ایجاد میکند یا تغییرات کلاسهای دومین برنامه را به صورت خودکار به بانک اطلاعاتی اعمال خواهد کرد.
- برای آشنایی بیشتر با مباحث تعریف رشته اتصالی EF Code First و مباحث Migrations آن، سری EF Code First را در سایت یکبار مطالعه کنید.
<add name="connectionString1" connectionString="Data Source=(local);Initial Catalog=TestDbIdentity;Integrated Security = true" providerName="System.Data.SqlClient" />
- «در پوشه App_Data حذف کردم» ... از مثال نهایی کامل شده استفاده کنید (^) و نیازی به تکرار این مراحل نیست تا خطای یافت نشدن dbcontext را دریافت نکنید.
- برای ReCreate فقط کافی هست که بانک اطلاعاتی TestDbIdentity را drop کنید. بعد برنامه را مجددا از نو اجرا کنید. چون مراحل migrations آن به حالت خودکار تنظیم شدهاست، بانک اطلاعاتی را به صورت خودکار ایجاد میکند یا تغییرات کلاسهای دومین برنامه را به صورت خودکار به بانک اطلاعاتی اعمال خواهد کرد.
- برای آشنایی بیشتر با مباحث تعریف رشته اتصالی EF Code First و مباحث Migrations آن، سری EF Code First را در سایت یکبار مطالعه کنید.
نظرات مطالب
معرفی کتابخانه PdfReport
درون سیلورلایت ، سورس فریم را به مسیر فایل پی دی اف (که توسط دستور AsPdfFile تولید میشود بوسیله WCF ) ست میکنم. امکان این وجود دارد که فایل بطور مستقیم درون فریم نمایش داده شود و در جایی ذخیره نشود؟