无法加载FsXaml.Wpf.TypeProvider

时间:2016-11-28 06:32:29

标签: wpf mvvm f# fsxaml fsharp.viewmodule

我试图在F#中使用WPF。我使用F#Empty Windows App模板创建了一个项目(事实上,我已经使用不同的设置创建了几个)。然后我添加了FSharp.ViewModule和FsXaml.Wpf引用。当项目只有MainWindow.xaml和MainWindow.xaml.fs时,它工作正常。但是当我添加另一个.xaml View文件和.fs ViewModel文件时,我在"命名空间ViewModels"上得到以下错误:声明位于.fs文件的顶部:

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)

在帖子" FsXaml加载错误"中描述了类似的问题。 (我无法添加评论,因为我没有足够的声誉)。但我已经尝试了那里给出的答案 - 更改CPU和F#运行时 - 并且两者都无法正常工作。

我在Windows 7 SP1 64位虚拟机中使用Visual Studio 2015社区版。我尝试使用以下框架和DLL版本:

  • NET Framework 4.5和4.6
  • F#3.0和4.0
  • FSharp.ViewModule 0.9.9和0.9.9.3
  • FsXaml.Wpf 2.0.0和2.1.0

编辑1: 在回复下面的Reed评论时,这是我的两个显示错误的代码文件。首先,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

这里是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

在这两个文件中,我在namespace ViewModels下和XAML下变为红色,波浪线。当它只有MainWindow.xaml.fs时,该项目将构建,但是因为我添加了Dialog.fs

编辑2: 这是我的.fsproj文件

<?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>

编辑3:App.fs正在提供错误&#34;字段,构造函数或成员&#39; Root&#39;没有定义。

module main
open System
open FsXaml

type App = XAML<"App.xaml">

[<STAThread>]
[<EntryPoint>]
let main argv =
    App().Root.Run()

而且packages.config正在发出警告&#34;&#39; packages&#39;元素未声明&#34;。

<?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>

1 个答案:

答案 0 :(得分:3)

在当前版本的FsXaml(2.1和2.0)中,您不再包含第二个静态参数:

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

此外,在Dialog.fs中,您需要添加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

我建议使用F#4(需要3.1或更高版本),以及最新的FsXaml和FSharp.ViewModule。