本帖最后由 Richard.Ma 于 2020-12-2 14:56 编辑
此博客将介绍如何使用新控件在 .NET 5 WinForms和.NET Core WinForms中创建新项目, 以及如何移植旧项目到新平台中。 用于.NET Core 3.1和 .NET 5 的Spread.NET 14 Windows Forms NuGet包Spread.NET 14包括了 .NET Core 3.1和 .NET 5 Winforms的新控件,目前可以在 NuGet 中下载使用用。 当然,控件仍然支持 .NET 4.5.2 目标框架,您可以在所有受支持的平台中使用这些新控件。 Spread.NET 14还包括新的使用相同API的全框架控件,因此您可以使用具有完整设计时支持的全框架控件创建新项目,还可以为 .NET Core 3.1或 .NET 5创建平行项目,使用相同的源码针对新控件进行构建,前提是代码可以移植。您可以使用 微软的 可移植性分析器工具确定代码到新平台的可移植性。 请注意,在.NET Core 3.1和.NET 5 Windows Forms中,新Spread.NET 14控件不像全框架的Spread.NET 14 Windows Forms控件那样在Visual Studio中支持设计时,因此,当您想在Visual Studio中使用Spread.NET 14的完整设计时功能集时,建议使用全框架控件进行开发,例如使用Spread Designer工具设计电子表格。您可以在解决方案中为.NET Core 3.1或.NET 5创建平行项目,并为这些目标框架构建相同的源码。
将项目移植到.NETCore 3.1和.NET 5下面会使用一个示例项目“年度财务报告”,来演示如何将现有的Spread.NET 13 Windows Forms(或更早的版本)项目,通过新的 Spread.NET 14 Windows Forms NuGet 包控件来转换目标框架为.NET Core 3.1或.NET 5
此演示样本随C#和VB.NET的产品一起安装。你可以在安装目录下如下位置找到此演示的C#版本“Samples\C#\Spread.Examples\GrapeCity.AnnualFinancialReport\GrapeCity.AnnualFinancialReport.sln”
包含多个项目和项目依赖项的解决方案(如本示例)应自下而上处理,首先是没有依赖项的依赖项目,然后是依赖于这些项目的项目。为了避免与bin和obj文件夹潜在冲突,应在包含相关的.NET全框架项目的文件夹下的子文件夹中创建新的netcore3.1项目。 第 1 步:为新的 netcore3.1 项目创建文件夹创建以下新文件夹(使用 Windows 资源管理器):
- Samples\C#\Common\Spread.Commom.DataStore\netcore
- Samples\C#\Common\Spread.Common.Features\netcore
- Samples\C#\Spread.Examples\GrapeCity.AnnualFinancialReport\netcore
这些新文件夹将是我们接下来创建的新netcore3.1项目文件的保存位置。 第 2 步:创建项目Spread.Common.DataStore.Core对于此步骤,转到文件夹 Samples \ C#\Common \ Spread.Commom.DataStore并打开正在记事本(或其他文本编辑器)中移植的Spread.Common.DataStore.csproj。这对于将复制到下一步将创建的新项目文件中很有用。 使用记事本或其他文本编辑器,创建一个新文件,并将此基线内容粘贴到新的Spread.Common.DataStore.Core项目中: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp3.1;net5.0-windows</TargetFrameworks> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <AssemblyName>Spread.Common.DataStore.Core</AssemblyName> <RootNamespace>Spread.Common.DataStore</RootNamespace> </PropertyGroup>
</Project>
|
接下来,我们需要添加原始项目中包含的所有文件和资源。在Spread.Common.DataStore.csproj中找到包含源文件和资源文件的块(<ItemGroup>包含<Compile Include = ...>或<Content Include = ...>),然后将其复制到新项目中,对于粘贴的每个源路径,请在路径前面插入“ .. \”,以修复新项目文件相对于源文件的位置的文件路径: <ProjectSdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp3.1;net5.0-windows</TargetFrameworks> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <AssemblyName>Spread.Common.DataStore.Core</AssemblyName> <RootNamespace>Spread.Common.DataStore</RootNamespace> </PropertyGroup> <ItemGroup> <CompileInclude="..\DataSourceEntities\COGSDataSource.cs" /> <CompileInclude="..\DataSourceEntities\DashBoardDataSource.cs" /> <CompileInclude="..\DataService.cs" /> <CompileInclude="..\DataSourceEntities\FinancialKPIDataSource.cs" /> <CompileInclude="..\DataSourceEntities\IncomeStatementDataSource.cs" /> <CompileInclude="..\DataSourceEntities\JsonDataSource.cs" /> <CompileInclude="..\DataSourceEntities\KPIDataSource.cs" /> <CompileInclude="..\DataSourceEntities\AccessDataSource.cs" /> <CompileInclude="..\DataSourceEntities\OrderEntryDataSource.cs" /> <CompileInclude="..\DataSourceEntities\StudentCalendarDataSource.cs" /> <CompileInclude="..\DataSourceEntities\StudentDashboardDataSource.cs" /> <CompileInclude="..\GCVersion35.cs" /> <CompileInclude="..\Model\AbsenceSchedule.cs" /> <CompileInclude="..\Model\AbsentRecord.cs" /> <CompileInclude="..\Model\BusinessExpense.cs" /> <CompileInclude="..\Model\BusinessRevenue.cs" /> <CompileInclude="..\Model\BusinessStat.cs" /> <CompileInclude="..\Model\COGS.cs" /> <CompileInclude="..\Model\Company.cs" /> <CompileInclude="..\Model\Customer.cs" /> <CompileInclude="..\Model\CustomerTarget.cs" /> <CompileInclude="..\Model\DashBoardItems.cs" /> <CompileInclude="..\Model\Employee.cs" /> <CompileInclude="..\Model\FinancialKPI.cs" /> <CompileInclude="..\Model\Interfaces\IStudentRecord.cs" /> <CompileInclude="..\Model\Interfaces\IDateTime.cs" /> <CompileInclude="..\Model\Invoice.cs" /> <CompileInclude="..\Model\InvoiceParts.cs" /> <CompileInclude="..\Model\InvoiceServices.cs" /> <CompileInclude="..\Model\KPIList.cs" /> <CompileInclude="..\Model\LastSomeMatchStatus.cs" /> <CompileInclude="..\Model\MarketSale.cs" /> <CompileInclude="..\Model\Match.cs" /> <CompileInclude="..\Model\MatchPointTable.cs" /> <CompileInclude="..\Model\MovieRecord.cs" /> <CompileInclude="..\Model\Parts.cs" /> <CompileInclude="..\Model\Product.cs" /> <CompileInclude="..\Model\Region.cs" /> <CompileInclude="..\Model\Sale.cs" /> <CompileInclude="..\Model\ScoreRecord.cs" /> <CompileInclude="..\Model\Student.cs" /> <CompileInclude="..\Model\StudentSchedule.cs" /> <CompileInclude="..\Model\TardyRecord.cs" /> <CompileInclude="..\Model\Team.cs" /> <CompileInclude="..\Model\TermSession.cs" /> <CompileInclude="..\Model\Vehicle.cs" /> <CompileInclude="..\Properties\AssemblyInfo.cs" /> <CompileInclude="..\Utilities\FileUtilities.cs" /> </ItemGroup> <ItemGroup> <ContentInclude="..\Data\AbsenceSchedule.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\AbsentRecords.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\AgingReportCustomers.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\AgingReportInvoices.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\BusinessStats.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Companies.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Customers.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\CustomerTarget.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\DashBoardCustomers.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\DashBoardInvoices.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\DashBoardTargetMaster.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Employee.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\movie_data.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\FinancialKPIList.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\FinancialTargetMaster.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Invoice.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\InvoiceParts.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\InvoiceServices.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\KPIList.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MarketSales.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <Content Include="..\Data\MatchCurrentYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchFourthLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchSecondLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchThirdLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Parts.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Products.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Regions.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Sales.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\ScoreRecords.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Students.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\TardyRecords.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\TargetMaster.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Team.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\TermSessions.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Vehicle.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Resources\GrapeCity.thmx"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <ContentInclude="..\Data\fpnorthwinds.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\fpWine.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Nwind.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <Content Include="..\Data\Patients2000.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\receivables.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
</Project> 步骤3:添加表单资源之前的csproj和vbproj项目类型会自动包含表单的资源文件,因此,如果您的项目包含任何表单,则还需要在<Project> </ Project>中为每种表单添加资源: 表单资源示例 <EmbeddedResource Include="..\Form.resx"> <DependentUpon>Form.cs</DependentUpon> </EmbeddedResource> |
在项目文件夹中搜索在新项目中未显式引用的resx文件,并为相关表单添加每个resx和cs,如上所示。在此示例中,没有任何形式的resx可以添加到任何项目中,但是您的项目可能包含此类resx文件,如果不包含这些文件,则在执行步骤9并尝试运行以下命令时可能会出错。在这种情况下,通常可以通过在适当的项目中添加缺少的资源来解决问题。 将文件另存为 Samples\C#\Common\Spread.Commom.DataStore\netcore\Spread.Common.DataStore.Core.csproj 注意: 您还必须保存使用Spread.NET WinForms早期版本(v13和更早版本)使用的设计时更改,并使用v14更新一些用于序列化控件的类,因为某些以前在.NET Framework早期版本中可序列化的类在.NET 5中不再可序列化。对于使用较早版本保存的所有Spread XML文件,此过程也是必需的。请注意,XML文件格式已被弃用,建议您将XLSX格式与 Exchangeable标志一起使用。 步骤4:创建项目Spread.Common.Features.Core重复步骤2-3,来创建新项目Spread.Common.Features.Core, 使用Samples\C#\Common\Spread.Commom.Features\Spread.Common.Features.csproj复制源代码和此模板以创建初始的空项目文件: 项目文件: <ProjectSdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp3.1;net5.0-windows</TargetFrameworks> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <AssemblyName>Spread.Common.Features.Core</AssemblyName> <RootNamespace>Spread.Common.Features</RootNamespace> </PropertyGroup>
</Project>
接下来,从 Samples\C#\Common\Spread.Commom.Features\Spread.Common.Features.csproj:复制源码和资源文件(<ItemGroup> 包含<Compile Include=...> 或 <Content Include=...>): <ProjectSdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <TargetFrameworks>netcoreapp3.1;net5.0-windows</TargetFrameworks> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <AssemblyName>Spread.Common.Features.Core</AssemblyName> <RootNamespace>Spread.Common.Features</RootNamespace> </PropertyGroup> <ItemGroup> <CompileInclude="..\DataSourceEntities\COGSDataSource.cs" /> <CompileInclude="..\DataSourceEntities\DashBoardDataSource.cs" /> <CompileInclude="..\DataService.cs" /> <CompileInclude="..\DataSourceEntities\FinancialKPIDataSource.cs" /> <CompileInclude="..\DataSourceEntities\IncomeStatementDataSource.cs" /> <CompileInclude="..\DataSourceEntities\JsonDataSource.cs" /> <CompileInclude="..\DataSourceEntities\KPIDataSource.cs" /> <CompileInclude="..\DataSourceEntities\AccessDataSource.cs" /> <CompileInclude="..\DataSourceEntities\OrderEntryDataSource.cs" /> <CompileInclude="..\DataSourceEntities\StudentCalendarDataSource.cs" /> <CompileInclude="..\DataSourceEntities\StudentDashboardDataSource.cs" /> <CompileInclude="..\GCVersion35.cs" /> <CompileInclude="..\Model\AbsenceSchedule.cs" /> <CompileInclude="..\Model\AbsentRecord.cs" /> <CompileInclude="..\Model\BusinessExpense.cs" /> <CompileInclude="..\Model\BusinessRevenue.cs" /> <CompileInclude="..\Model\BusinessStat.cs" /> <CompileInclude="..\Model\COGS.cs" /> <CompileInclude="..\Model\Company.cs" /> <CompileInclude="..\Model\Customer.cs" /> <CompileInclude="..\Model\CustomerTarget.cs" /> <CompileInclude="..\Model\DashBoardItems.cs" /> <CompileInclude="..\Model\Employee.cs" /> <CompileInclude="..\Model\FinancialKPI.cs" /> <CompileInclude="..\Model\Interfaces\IStudentRecord.cs" /> <CompileInclude="..\Model\Interfaces\IDateTime.cs" /> <CompileInclude="..\Model\Invoice.cs" /> <CompileInclude="..\Model\InvoiceParts.cs" /> <CompileInclude="..\Model\InvoiceServices.cs" /> <CompileInclude="..\Model\KPIList.cs" /> <CompileInclude="..\Model\LastSomeMatchStatus.cs" /> <CompileInclude="..\Model\MarketSale.cs" /> <CompileInclude="..\Model\Match.cs" /> <CompileInclude="..\Model\MatchPointTable.cs" /> <CompileInclude="..\Model\MovieRecord.cs" /> <CompileInclude="..\Model\Parts.cs" /> <CompileInclude="..\Model\Product.cs" /> <CompileInclude="..\Model\Region.cs" /> <CompileInclude="..\Model\Sale.cs" /> <CompileInclude="..\Model\ScoreRecord.cs" /> <CompileInclude="..\Model\Student.cs" /> <CompileInclude="..\Model\StudentSchedule.cs" /> <CompileInclude="..\Model\TardyRecord.cs" /> <CompileInclude="..\Model\Team.cs" /> <CompileInclude="..\Model\TermSession.cs" /> <CompileInclude="..\Model\Vehicle.cs" /> <CompileInclude="..\Properties\AssemblyInfo.cs" /> <CompileInclude="..\Utilities\FileUtilities.cs" /> </ItemGroup> <ItemGroup> <ContentInclude="..\Data\AbsenceSchedule.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\AbsentRecords.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\AgingReportCustomers.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\AgingReportInvoices.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\BusinessStats.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Companies.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Customers.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\CustomerTarget.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\DashBoardCustomers.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\DashBoardInvoices.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\DashBoardTargetMaster.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Employee.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\movie_data.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\FinancialKPIList.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\FinancialTargetMaster.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Invoice.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\InvoiceParts.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\InvoiceServices.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\KPIList.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MarketSales.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchCurrentYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchFourthLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchSecondLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\MatchThirdLastYear.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Parts.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Products.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Regions.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Sales.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\ScoreRecords.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Students.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\TardyRecords.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\TargetMaster.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Team.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\TermSessions.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Vehicle.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Resources\GrapeCity.thmx"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <ContentInclude="..\Data\fpnorthwinds.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\fpWine.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Nwind.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\Patients2000.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <ContentInclude="..\Data\receivables.mdb"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
</Project>
将文件另存为 Samples\C#\Common\Spread.Commom.Features\netcore\Spread.Common.Features.Core.csproj. 步骤5:创建项目GrapeCity.AnnualFinancialReport.Core重复步骤2-3,以创建新项目GrapeCity.AnnualFinancialReport.Core, 使用Samples\C#\Examples\GrapeCity.AnnualFinancialReport\GrapeCity.AnnualFinancialReport.csproj复制源码和此模板以创建初始的空项目文件: GrapeCity.AnnualFinancialReport.Core.csproj <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFrameworks>netcoreapp3.1;net5.0-windows</TargetFrameworks> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <AssemblyName>GrapeCity.AnnualFinancialReport.Core</AssemblyName> <RootNamespace>GrapeCity.AnnualFinancialReport</RootNamespace> </PropertyGroup>
</Project> |
接下来,从 Samples \ C#\ Examples \ GrapeCity.AnnualFinancialReport \ GrapeCity.AnnualFinancialReport .csproj复制源和资源文件(<ItemGroup>包含<Compile Include =...>或<Content Include = ...>): <ProjectSdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFrameworks>netcoreapp3.1;net5.0-windows</TargetFrameworks> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <AssemblyName>GrapeCity.AnnualFinancialReport.Core</AssemblyName> <RootNamespace>GrapeCity.AnnualFinancialReport</RootNamespace> </PropertyGroup> <ItemGroup> <CompileInclude="..\AnnualFinancialReport.cs"> <SubType>UserControl</SubType> </Compile> <CompileInclude="..\AnnualFinancialReport.Designer.cs"> <DependentUpon>AnnualFinancialReport.cs</DependentUpon> </Compile> <CompileInclude="..\Form1.cs"> <SubType>Form</SubType> </Compile> <CompileInclude="..\Form1.Designer.cs"> <DependentUpon>Form1.cs</DependentUpon> </Compile> <CompileInclude="..\Program.cs" /> <CompileInclude="..\Properties\AssemblyInfo.cs" /> <EmbeddedResourceInclude="..\AnnualFinancialReport.resx"> <DependentUpon>AnnualFinancialReport.cs</DependentUpon> </EmbeddedResource> <EmbeddedResourceInclude="..\Properties\licenses.licx" /> <EmbeddedResourceInclude="..\Properties\Resources.resx"> <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> <SubType>Designer</SubType> </EmbeddedResource> <CompileInclude="..\Properties\Resources.Designer.cs"> <AutoGen>True</AutoGen> <DependentUpon>Resources.resx</DependentUpon> <DesignTime>True</DesignTime> </Compile> <NoneInclude="..\Properties\app.manifest" /> <NoneInclude="..\Properties\Settings.settings"> <Generator>SettingsSingleFileGenerator</Generator> <LastGenOutput>Settings.Designer.cs</LastGenOutput> </None> <CompileInclude="..\Properties\Settings.Designer.cs"> <AutoGen>True</AutoGen> <DependentUpon>Settings.settings</DependentUpon> <DesignTimeSharedInput>True</DesignTimeSharedInput> </Compile> <NoneInclude="..\Resources\AnnualFinancialReport.xlsx" /> <NoneInclude="..\Resources\ExcelCompatibility.imp" /> </ItemGroup>
</Project>
将文件另存为Samples\C#\Examples\GrapeCity.AnnualFinancialReport\netcore\GrapeCity.AnnualFinancialReport.Core.csproj. 步骤6:在GrapeCity.AnnualFinancialReport.sln中添加新项目在名为netcore的解决方案中创建一个新文件夹,然后将每个新项目添加到该文件夹​​下的解决方案中:
步骤7:添加新的项目引用项目Spread.Common.DataStore.Core需要一些包引用。要添加这些引用,请在解决方案资源管理器中展开该项目,然后右键单击“ Dependencies”节点,然后选择“ ManagerNuGet Packages ...”以打开NuGet Package Manager,然后选中“ Include Prerelease”框并使用“浏览”选项卡进行搜索Newton.Json和System.Data.OleDb软件包,然后从nuget.org安装每个软件包的最新版本–之后,“已安装”选项卡应如下所示:
项目GrapeCity.AnnualFinancialReport.Core需要其他两个项目Spread.Common.DataStore.Core和Spread.Common.Features.Core,因此首先使用“添加项目引用...”来添加对这些项目的引用:
然后使用NuGet软件包管理器添加GrapeCity.Spread.WinForms的引用:
步骤8:组织项目文件夹并镜像原始项目结构最后一步涉及组织新项目中的所有项目源和资源文件链接,以匹配原始项目中的组织和结构,包括所有项目文件夹和子文件夹。 该GrapeCity.Common.DataStore项目有很多的子文件夹组织源和资源文件(属性, 数据,DataSourceEntities,型号必须在新的内部创建等)GrapeCity.Common.DataStore.Core项目,每个文件的链接必须是移动到适当的文件夹以匹配原始项目的组织。您可以右键单击该项目,然后使用添加→新建文件夹创建文件夹,然后将源文件和资源文件链接拖放到适当的位置。结果应如下所示:
该GrapeCity.Common.Features项目也有很多的子文件夹,需要类似的组织。按照上面做的步骤GrapeCity.Common.Features.Core镜的结构GrapeCity.Common.Features,结果应该是这样的:
该GrapeCity.AnnualFinancialReport项目只有2子文件夹,属性和资源,所以它更容易组织。结果应如下所示:
步骤9:编译并执行现在,新的netcoreapp3.1项目应该已准备好构建和运行。右键单击GrapeCity.AnnualFinancialReport.Core项目,然后选择Set as Startup Project,然后按F5键开始调试,该项目应该可以正常运行:
图10 GrapeCity.AnnualFinancialReport.Core运行 如果确实出现错误,则可能是某些缺少与表单相关联的resx文件,而该文件没有包含在需要在步骤3中添加的新csproj或vbproj中。 将VB项目移植到.NET Core 3.1和.NET 5移植VB项目的工作原理完全相同,除了使用文件类型csproj而不是vbproj,有时还使用不同的文件夹名称(例如,使用My Project而不是Properties),但是适用相同的步骤。 下面链接的示例项目同时包含C#和VB版本以供参考。 使用设计时界面新平台控件尚不能很好地支持设计时界面,因此在设计时应继续使用完整框架版本和完整框架项目。在Spread设计和性能与e窗口中的所有内置式转换器和编辑器类型可使用较老的设计时开发的csproj和vbproj项目类型,并且所有更改会自动应用到.NET 5和.NET Core 3.1为这些项目构建。
如下是本教程所用的示例项目,大家可以下载后测试编译 |