我正在尝试将WPF与F#一起使用。我已经使用F#空Windows应用程序模板创建了一个项目(实际上,我已经使用不同的设置创建了多个项目)。然后,我添加了FSharp.ViewModule和FsXaml.Wpf引用。当项目只有MainWindow.xaml和MainWindow.xaml.fs时,它可以正常工作。但是,一旦我添加了另一个.xaml View文件和一个.fs ViewModel文件,我就会在.fs文件顶部的“命名空间ViewModels”声明中收到以下错误:

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 ViewModelsXAML下都出现了红色的波浪线。该项目仅在具有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给出错误“未定义字段,构造函数或成员'Root'。
    module main
    open System
    open FsXaml
    
    type App = XAML<"App.xaml">
    
    [<STAThread>]
    [<EntryPoint>]
    let main argv =
        App().Root.Run()
    

    然后packages.config发出警告“未声明'packages'元素”。
    <?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>
    

    最佳答案

    在当前版本的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。

    关于wpf - FsXaml.Wpf.TypeProvider无法加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40838357/

    10-09 08:18