2016-11-28 11 views
5

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> 
+3

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

+1

Bạn có đúng thứ tự của các tập tin? –

+2

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ế. –

Trả lời

3

Trong phiên bản hiện tại của FsXaml (2.1, và cũng 2.0), bạn không còn bao gồm các tham số tĩnh 2:

type MainView = XAML<"MainWindow.xaml"> // Remove the 2nd arg here ... 

Ngoài ra, trong Dialog.fs, bạn cần phải thêm open FsXaml:

namespace ViewModels 
open FSharp.ViewModule 
open FsXaml // This is probably causing the specific error you're seeing 

type DialogView = XAML<"Dialog.xaml"> // Again, remove the true 

Tôi khuyên bạn nên sử dụng F # 4 (3.1 trở lên là bắt buộc) và FsXaml và FSharp.ViewModule mới nhất.

+0

Cảm ơn Reed, tôi gần đến rồi! Nhưng sau khi thực hiện những thay đổi đó và sử dụng các phiên bản mới nhất của FsXaml và FSharp.ViewModule, tôi vẫn gặp lỗi trên 'Root' trong App.fs, nó dừng việc xây dựng và cảnh báo trong packages.config - xem EDIT 3 ở trên . – DenisV

+1

@DenisV remove .Root ... không cần thiết bây giờ. các gói là một cảnh báo sai. Đóng nó trong VS và nó sẽ biến mất. –

+1

Điều đó hoạt động Reed - cảm ơn sự giúp đỡ của bạn! – DenisV

Các vấn đề liên quan