Tôi đang cố gắng sử dụng WPF với F #. Tôi đã tạo một dự án bằng cách sử dụng mẫu F # Empty Windows App (trên thực tế, tôi đã tạo một số dự án bằng cách sử dụng các cài đặt khác nhau). Sau đó, tôi đã thêm tham chiếu FSharp.ViewModule và FsXaml.Wpf. Nó hoạt động tốt khi dự án chỉ có MainWindow.xaml và MainWindow.xaml.fs. Nhưng ngay sau khi tôi thêm một .xaml Xem và file ViewModel .fs, tôi nhận được lỗi sau trên "ViewModels namespace" tuyên bố ở đầu các file .fs:FsXaml.Wpf.TypeProvider không thể được tải
The type provider '...\packages\FsXaml.Wpf.2.1.0\lib\net45\FsXaml.Wpf.TypeProvider.dll' reported an error: Assembly attribute 'TypeProviderAssemblyAttribute' refers to a designer assembly 'FsXaml.Wpf.TypeProvider' which cannot be loaded or doesn't exist. Could not load file or assembly 'file:///...\packages\FsXaml.Wpf.2.1.0\lib\net45\FsXaml.Wpf.TypeProvider.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
Có một vấn đề tương tự được mô tả trong bài "lỗi tải FsXaml" (mà tôi không thể thêm nhận xét vào vì tôi không có đủ danh tiếng). Nhưng tôi đã thử cả hai câu trả lời được đưa ra ở đó - thay đổi CPU và thời gian chạy F # - và cả hai đều không hoạt động.
Tôi đang sử dụng phiên bản Cộng đồng Visual Studio 2015 trong máy ảo Windows 7 SP1 64 bit. Và tôi đã cố gắng sử dụng các khuôn khổ và DLL phiên bản sau:
- NET Framework 4.5 và 4.6
- F # 3.0 và 4.0
- FSharp.ViewModule 0.9.9 và 0.9.9.3
- FsXaml.Wpf 2.0.0 và 2.1.0
EDIT 1: Trả lời nhận xét của Reed bên dưới, đây là hai tệp mã của tôi đang hiển thị lỗi. Thứ nhất, MainWindow.xaml.fs:
namespace ViewModels
open FSharp.ViewModule
open FsXaml
type MainView = XAML<"MainWindow.xaml", true>
type MainViewModel() as self =
inherit ViewModelBase()
let text = self.Factory.Backing (<@ self.Text @>, "")
let newCommand = self.Factory.CommandSync (fun _ -> self.Text <- "File > Open")
let openCommand = self.Factory.CommandSync(fun _ -> self.Text <- "File > Open")
let closeCommand = self.Factory.CommandSync(fun _ -> self.Text <- "File > Close")
let exitCommand = self.Factory.CommandSync(fun _ -> self.Text <- "File > Exit")
member x.Text with get() = text.Value and set value = text.Value <- value
member x.NewCommand = newCommand
member x.OpenCommand = openCommand
member x.CloseCommand = closeCommand
member x.ExitCommand = exitCommand
Và đây là Dialog.fs:
namespace ViewModels
open FSharp.ViewModule
type DialogView = XAML<"Dialog.xaml", true>
type DialogVM() as self =
inherit ViewModelBase()
let name = self.Factory.Backing (<@ self.Name @>, "")
let address = self.Factory.Backing (<@ self.Address @>, "")
member x.Name with get() = name.Value and set value = name.Value <- value
member x.Address with get() = address.Value and set value = address.Value <- value
Trong cả hai tập tin tôi có được màu đỏ đít, in nghiêng dòng dưới namespace ViewModels
và dưới XAML
. Dự án sẽ xây dựng khi nó chỉ có MainWindow.xaml.fs, nhưng không phải vì tôi thêm Dialog.fs
EDIT 2: Dưới đây là tập tin .fsproj tôi
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>b765eaca-f0ed-4898-bfea-fa19fca3788d</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Test</RootNamespace>
<AssemblyName>Test</AssemblyName>
<targetframeworkversion>v4.5</targetframeworkversion>
<TargetFSharpCoreVersion>4.3.0.0</TargetFSharpCoreVersion>
<Name>Test</Name>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<Tailcalls>false</Tailcalls>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<DocumentationFile>bin\Debug\Test.XML</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<Tailcalls>true</Tailcalls>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<DocumentationFile>bin\Release\Test.XML</DocumentationFile>
</PropertyGroup>
<PropertyGroup>
<MinimumVisualStudioVersion Condition="'$(MinimumVisualStudioVersion)' == ''">11</MinimumVisualStudioVersion>
</PropertyGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '11.0'">
<PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')">
<FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets')">
<FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
</PropertyGroup>
</Otherwise>
</Choose>
<Import Project="$(FSharpTargetsPath)" />
<ItemGroup>
<None Include="Dialog.xaml" />
<Compile Include="Dialog.fs" />
<Resource Include="MainWindow.xaml" />
<Compile Include="MainWindow.xaml.fs" />
<Resource Include="App.xaml" />
<Compile Include="App.fs" />
<Content Include="App.config" />
<Content Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Reference Include="Accessibility" />
<Reference Include="FSharp.ViewModule.Core.Wpf">
<HintPath>..\..\packages\FSharp.ViewModule.Core.0.9.9.1\lib\net45\FSharp.ViewModule.Core.Wpf.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FsXaml.Wpf">
<HintPath>..\..\packages\FsXaml.Wpf.0.9.9\lib\net45\FsXaml.Wpf.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FsXaml.Wpf.TypeProvider">
<HintPath>..\..\packages\FsXaml.Wpf.0.9.9\lib\net45\FsXaml.Wpf.TypeProvider.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<Private>True</Private>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="PresentationUI" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Numerics" />
<Reference Include="System.Windows.Interactivity">
<HintPath>..\..\packages\Expression.Blend.Sdk.1.0.2\lib\net45\System.Windows.Interactivity.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Xaml" />
<Reference Include="System.Xml" />
<Reference Include="UIAutomationProvider" />
<Reference Include="UIAutomationTypes" />
<Reference Include="WindowsBase" />
</ItemGroup>
</Project>
EDIT 3: App.fs là cho lỗi "các lĩnh vực, xây dựng, hoặc thành viên 'root' không được định nghĩa.
module main
open System
open FsXaml
type App = XAML<"App.xaml">
[<STAThread>]
[<EntryPoint>]
let main argv =
App().Root.Run()
Và packages.config là đưa ra các cảnh báo 'Yếu tố 'gói' không được công bố'.
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Expression.Blend.Sdk" version="1.0.2" targetFramework="net45" />
<package id="FSharp.ViewModule.Core" version="0.9.9.3" targetFramework="net45" />
<package id="FsXaml.Wpf" version="2.1.0" targetFramework="net45" />
</packages>
Có \ packages \ FsXaml.Wpf.2.1.0 \ lib \ net45 \ FsXaml.Wpf.TypeProvider.dll tồn tại không? Hãy thử một số câu trả lời trong câu hỏi này http://stackoverflow.com/questions/21753979/visual-studio-could-not-load-file-or-assembly-operation-is-not-supported-erro – Will
Bạn có đúng thứ tự của các tập tin? –
Nếu điều đó không hoạt động - bạn có thể cần phải hiển thị mã và lỗi/vị trí/v.v. thực tế. –