2016-11-28 5 views
5

Я пытаюсь использовать WPF с F #. Я создал проект с использованием шаблона F # Empty Windows App (фактически, я создал несколько, используя разные настройки). Затем я добавил ссылки FSharp.ViewModule и FsXaml.Wpf. Он отлично работает, когда проект имеет только MainWindow.xaml и MainWindow.xaml.fs. Но как только я добавил еще один .xaml Просмотр файла и .fs файл ViewModel, я получаю следующее сообщение об ошибке на «пространства имен ViewModels» объявление в верхней части файлов .fs:FsXaml.Wpf.TypeProvider не может быть загружен

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 # - и никто не работает.

Я использую Visual Studio 2015 Community Edition в 64-разрядной виртуальной машине Windows 7 SP1. И я попытался использовать следующие рамочные и 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

EDIT 1: В ответ на комментарий Рида ниже, вот мои два файла кода, которые показывают ошибки. Во-первых, 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

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

EDIT 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 дает предупреждение„элемент „пакеты“ не объявлен“.

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

Существует ли \ packages \ FsXaml.Wpf.2.1.0 \ lib \ net45 \ FsXaml.Wpf.TypeProvider.dll? Попробуйте некоторые ответы в этом вопросе http://stackoverflow.com/questions/21753979/visual-studio-could-not-load-file-or-assembly-operation-is-not-supported-erro – Will

+1

Есть ли у вас правильный порядок файлов? –

+2

Если это не сработает - вам может потребоваться показать код и фактическую ошибку/местоположение/etc. –

ответ

3

В текущей версии FsXaml (2.1, а также 2,0), вы больше не включать 2-й статический параметр:

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.

+0

Спасибо, Рид, я почти там! Но после внесения этих изменений и использования последних версий FsXaml и FSharp.ViewModule, я все еще получаю сообщение об ошибке «Root» в App.fs, которая останавливает его при создании, и предупреждение в файле packages.config - см. EDIT 3 выше , – DenisV

+1

@DenisV remove .Root ... он не нужен сейчас. пакеты являются ложным предупреждением. Закройте его в VS, и он исчезнет. –

+1

Что работает Рид - спасибо за вашу помощь! – DenisV