"> ارتقاء WinForm App جهت پشتیبانی از NET Core 3.0. | ام اس پی سافت

ارتقاء WinForm App جهت پشتیبانی از NET Core 3.

WinForm

.NET Core 3.0 پشتیبانی از WinForm ها را جهت ساخت برنامه های ویندوزی همراه با خود آورده است. تا پایان مقاله همراه ما باشید.

در این مقاله، مراحل مورد نیاز جهت تبدیل WinForm های قدیمی به WinForm های .NET Core 3.0 آورده شده است.

NET Core 3.0.

.NET Core 3.0 تجسمی جدید از NET Framework. به همراه ارتقائاتی می باشد.

.NET Core 3.0 با بسیاری از توزیع های Linux سازگار بوده و بر روی macOS نیز اجرا می شود.

.NET Core 3.0 از WinForm ها پشتیبانی می کند، اما قادر نخواهید بود آن را بر روی Linux و macOS اجرا کنید.

خروجی تبدیل، یک تک فایل EXE خواهد بود.

Upgrading

ما یک WinForms App بزرگ را به .NET Core 3.0 ارتقاء دادیم. یک روز زمان برد ، اما نه به این دلیل که دشوار بود بلکه به این دلیل که منابع آنلاین موجود، گیج کننده هستند.

قدم اول، ایجاد یک Solution جدید بود، و قدم به قدم پروژه را از solution اصلی ، از پایه انجام دادیم.

پس از آن، تمامی فایل های پروژه و پوشه های Resources و Properties را کپی کردیم، در پوشه ی Properties، فایل AssemblyInfo.cs و هرچه *.licx وجود داشت را حذف کردیم.

هنگام ارتقاء، ممکن است برخی اسمبلی ها موجود نبوده یا سازگار نباشند.

فضای نام را، اگر از Microsoft است، در NuGet جستجو کنید، یا جایگزینی برای آن در .NET Core 3.0 جستجو کنید.

در این شرایط ، دو اسمبلی اهمیتی نداشتند، لذا کد آن ها را به اینصورت غیرفعال کردیم:

#if (DLL1)  
  
// ~code  
 
#endif  

پیکربندی پروژه جهت اجرا با یک تک فایل EXE

این مثال برای ویندوز است، استقرار یافته برای win-x86 ، که بر روی سیستم عامل ویندوز، هم ۳۲ بیتی و هم ۶۴ بیتی، اجرا می شود.

هنگام پیکربندی جهت انتشار، یک باگ در این فرآیند پیدا کردیم.

The fix: to add a singular key: RuntimeIdentifier because an error occurred NETSDK1097، که به دنبال آن در https://github.com/dotnet/core/issues/2851 رفتیم، بدون هیچ راه حلی.

لذا عینا پیغام را تفسیر کرده و فرض کردیم که اشتباهی از سوی طراح بوده است.

برای اینکه کار کند، این کلیدها را به .csproj اضافه کنید،

<PropertyGroup>    
   <OutputType>WinExe</OutputType>    
   <TargetFramework>netcoreapp3.0</TargetFramework>    
   <UseWindowsForms>true</UseWindowsForms>    
    
   <PublishSingleFile>true</PublishSingleFile>        
   <PublishTrimmed>true</PublishTrimmed>    
   <TieredCompilationQuickJit>true</TieredCompilationQuickJit>        
   <PublishReadyToRun>true</PublishReadyToRun>    
   <RuntimeIdentifier>win-x86</RuntimeIdentifier>    
   <RuntimeIdentifiers>win-x86</RuntimeIdentifiers>    
 </PropertyGroup>    

توجه داشته باشید که این یک کلید جهت اجتناب از خطا مورد نیاز است، گرچه در مجموع تکثیر شده است:

<RuntimeIdentifier>win-x86</RuntimeIdentifier>    

خطای انتشار

WinForm

انتشار یک برنامه در یک تک فایل بدون مشخص کردن یک RuntimeIdentifier پشتیبانی نمی شود.

خواهشمند است یک RuntimeIdentifier مشخص کرده یا مقدار PublishSingleFile را برابر false قرار دهید.

خطای پیغام داخلی فایل .tmp:

System.AggregateException: One or more errors occurred. ---> System.Exception: Publishing failed.  
   --- End of inner exception stack trace ---  
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)  
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)  
   at Microsoft.Publish.Framework.Model.DefaultPublishSteps.<>c__DisplayClass26_0.<IsBuildCompletedSuccessfully>b__2()  
   at System.Threading.Tasks.Task`1.InnerInvoke()  
   at System.Threading.Tasks.Task.Execute()  
--- End of stack trace from previous location where exception was thrown ---  
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)  
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)  
   at Microsoft.Publish.Framework.Model.DefaultPublishSteps.<DefaultCorePublishStep>d__23.MoveNext()  
--- End of stack trace from previous location where exception was thrown ---  
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)  
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)  
   at Microsoft.Publish.Framework.ViewModel.ProfileSelectorViewModel.<RunPublishTaskAsync>d__202.MoveNext()  
---> (Inner Exception #0) System.Exception: Publishing failed.<---  
  
System.Exception: Publishing failed.  
  
===================  

Publising

حال نیاز است پروفایلی برای این مورد ایجاد کنید

WinForm

اگر برنامه ی شما تنها در فرآیند x64 اجرا می شود، می توانید هدف زمان اجرای دیگری را انتخاب کنید.

امیدوارم این پست شما را در ارائه ی راه حلی بهتر و سریع تر به کاربران نهایی خود یاری کند.

اگر از متد SqlConnection.GetSchema استفاده می کنید، خطای زمان اجرای : “Column requires a valid datatype.” را دریافت خواهید کرد.

جهت رفع آن، مقدار PublishTrimmed را برابر false قرار دهید: <PublishTrimmed>false</PublishTrimmed>

انتهای این پیغام را برای جزئیات بیشتر جهت فراخوانی رفع اشکال ( just-in-time ( JIT  مشاهده کنید.

System.ArgumentException: Column requires a valid DataType.
at System.Data.DataColumn.set_DataType(Type value)
at System.Data.XSDSchema.SetProperties(Object instance, XmlAttribute[] attrs)
at System.Data.XSDSchema.HandleElementColumn(XmlSchemaElement elem, DataTable table, Boolean isBase)
at System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, Boolean isBase)
at System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, Boolean isRef)
at System.Data.XSDSchema.HandleTable(XmlSchemaElement node)
at System.Data.XSDSchema.HandleDataSet(XmlSchemaElement node, Boolean isNewDataSet)
at System.Data.XSDSchema.LoadSchema(XmlSchemaSet schemaSet, DataSet ds)
at System.Data.DataSet.ReadXSDSchema(XmlReader reader, Boolean denyResolving)
at System.Data.DataSet.ReadXml(XmlReader reader, Boolean denyResolving)
at System.Data.DataSet.ReadXml(Stream stream)
at System.Data.ProviderBase.DbMetaDataFactory.LoadDataSetFromXml(Stream XmlStream)
at System.Data.ProviderBase.DbMetaDataFactory..ctor(Stream xmlStream, String serverVersion, String normalizedServerVersion)
at System.Data.SqlClient.SqlConnectionFactory.CreateMetaDataFactory(DbConnectionInternal internalConnection, Boolean& cacheMetaDataFactory)
at System.Data.ProviderBase.DbConnectionFactory.GetMetaDataFactory(DbConnectionPoolGroup connectionPoolGroup, DbConnectionInternal internalConnection)
at System.Data.ProviderBase.DbConnectionInternal.GetSchema(DbConnectionFactory factory, DbConnectionPoolGroup poolGroup, DbConnection outerConnection, String collectionName, String[] restrictions)
at System.Data.SqlClient.SqlConnection.GetSchema(String collectionName, String[] restrictionValues)
at System.Data.SqlClient.SqlConnection.GetSchema(String collectionName)
  • پسورد: www.mspsoft.com
زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

کدیشن ! مارکت پروژه های برنامه نویسی راه اندازی شدیه توکه پا بریم ببینم