How to get WPF XAML Designer to play nicely with IValidatableObject from NET Standard 2.0 libraries? - wpf

Background:
using Visual Studio 2017 v15.4 (no ReSharper or any weird extensions)
Repro solution includes 2 projects:
WPF project: .NET 4.6.1, using NuGet PackageReference format
Class library: NET Standard 2.0
Both projects have the System.ComponentModel.Annotations NuGet package installed.
Problem
After upgrading my WPF project's NuGet format from the old packages.config to the new PackageReference, I started experiencing design-time errors:
Or sometimes the harsher flavor:
To start with, the following ViewModel code works fine:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class MainWindowViewModel
{
public ValClass MyProp => new ValClass();
}
public class ValClass : IValidatableObject
{
//Implementation stuff
}
However, if I then define an identical class in my NET Standard project, and include that as a type in my ViewModel, it produces the error.
Comparing an F12 on the IValidatableObject of these 2 classes:
The WPF version:
#region Assembly System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.ComponentModel.DataAnnotations.dll
#endregion
The NET Standard 2.0 version:
#region Assembly System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// C:\Users\a0110\.nuget\packages\system.componentmodel.annotations\4.4.0\ref\netstandard2.0\System.ComponentModel.Annotations.dll
#endregion
It's clear that the same type and namespace are defined in assemblies with different names--not just assembly versions.
How can I get the XAML Designer to successfully locate whatever assembly is required to use IValidatableObject?
Things I have Tried
Installing VS v15.5 preview and targeting the WPF project to .NET 4.7 (also 15.5 preview 2 and 3, .NET 4.7.1)
Adding the old System.ComponentModel.DataAnnotations reference to the WPF project (with and without the NuGet version)
reverting back to packages.config format (this didn't actually succeed; it appears that I'm stuck with PackageReference!)
grabbing a copy of the System.ComponentModel.Annotations.dll from the project's output folder and referencing it directly (VS would not let me do this)
adding a bindingRedirect to my App.config
adding <DependsOnNETStandard>True</DependsOnNETStandard> to the .csproj
adding <DependsOnNETStandard>netstandard2.0</DependsOnNETStandard> to .csproj
adding <_HasReferenceToSystemRuntime>true</_HasReferenceToSystemRuntime> to .csproj
adding the NETStandard.Library NuGet package to the WPF project
Update
For anyone else who is plagued by this issue, I have found a workaround:
Locate the System.ComponentModel.Annotations.dll on your hard drive that your NET Standard project uses for IValidatableObject. Copy it to a location within your project.
Uninstall the System.ComponentModel.Annotations NuGet package from your solution
Give your NET Standard project a direct reference to DLL you copied
Give your WPF project a reference to the standard assembly System.ComponentModel.DataAnnotations
Upgrade your WPF project to target .NET 4.7.1
Compile. Your WPF design-time should be free from this error.
.

Related

How to bundle windows visual studio VSIX with other built application?

I found that the windows visual studio extension is targeted to .net framework and only .net framework (which seems not clearly described in the docs?), after switching our custom mono debugger extension to .net 7.0, with framework not compatible (between vsix project's .net framework 4.8 and debugger project's .net 7.0) error when building the vsix project.
If I switch the debugger project target back to .net framework 4.8 then I can build the extension along with the debugger and create a vsix bundle them togeter successfully.
I tried the previewing visual studio extensibility tools: the out-of-process solution, but the out-of-process way seems not have access to the dte object, thus no way to send the debug adapter launch command. If I use the in-process solution, then we head back to the .net framework target :(
The mono debugger extension is a "3rd party executable file" that launched by visual studio debug adapter. If I manually paste the .net 7.0 version mono debugger to the extension install location, the extension can still work with the debugger. I manage the debugger project and the vsix project within a solution is for easier project management only, in fact they are not referenced directly in code.
I switched our mono debugger project to .net 7.0 is for trying to upgrade our toolset to the newest unified framework (every other tool in our team are upgraded to .net 7.0).
TL;DR, how can we bundle a none .net framework targeted project along with a windows visual studio extension, which is targeted to .net framework only? Or how can we integrate/bundle/add built exe,dlls into the vsix container?
There are some solutions from other stackoverflow answers such as add dlls using vsixmanifest, but it can only add dll file, and the way it handle asset file seems not quite right, it just copy the dll to vsix project folder once, meaning it won't get updated when the dll's project rebuild.
Here I managed to bundle the files in a wonky way:
I create a publish folder under vsix project folder,
then copy the published debugger project file to it, add them as existing file to vsix project, and configure them as vsix content, copy to vsix,
then add a pre-build event for the vsix project, publishing our debugger project and output to this publish folder.
With process above, I can package the published file into vsix when trigger vsix project build.
For anyone have similar issue, you can have a try.

WPF with Dynamic module loading using prism

This is about WPF project with Dynamic module loading and navigation using prism. I am trying to figure out - how the WPF project loads shell module so that all related files such as Bootstrapper, catalog, etc. are initialized to register the modules (WPF projects) through catalog. This is required so we can use prism module loader.
More details below -
We are migrating a Silverlight project to a WPF project.
Silverlight Solution has following projects
MyProject.Web (aspx) with default.aspx which is initializing shell module ("I believe") by following code
<param name="source" value="ClientBin/ShellModule.xap" />
ShellModule Silverlight project with catalog.xaml which registers all Modularity:ModuleInfo and Bootstrapper.cs inheriting UnityBootstrapper which returns IModuleCatalog
Other Silverlight Module projects
I am trying to figure out how would WPF project achieve it without the MyProject.Web project and without a default.aspx
My very odd random guess - from App.xaml of Root project somehow?
WPF - https://prismlibrary.github.io/docs/wpf/legacy/Modules.html
Silverlight - https://www.wintellect.com/dynamic-module-loading-with-silverlight-navigation-using-prism/

Microsoft Interactions is not recognized in XAML

My goal:
I want to use Interaction Triggers in that way:
<i:Interaction.Triggers>
Therefore I opened the Nuget and installed this:
After this the two references (Microsoft.Expression.Interactions and System.Windows.Interactivity) were added to my project. The path of those points to the package directory (Blend.Interactivity.Wpf.1.0.1340.0) in my project folder.
The problem:
The namespace is not recognized by Visual Studio. I tried:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Intelisense is not recognizing any elements inside the i-Tag.
The .Net version of the project is 4.5.2.
I tried to remove and reinstall the package.
Any ideas what went wrong here?

Is it possible to use WinRT XAML Toolkit with WPF?

I try to install using Visual Studio Package Manager Console and got this error:
Install failed. Rolling back... Install-Package : Could not install
package 'WinRTXamlToolkit.Controls.Gauge 1.6.1.3'. You are trying to
install this package into a project that targets
'.NETFramework,Version=v4.5', but the package does not contain any
assembly references or content files that are compatible with that
framework. For more information, contact the package author. At line:1
char:1
+ Install-Package WinRTXamlToolkit.Controls.Gau
Not as a NuGet package, I think you'd need a WPF Toolkit (of some sort).
WinRT XAML Toolkit is based on CoreCLR, not on the full .NET 4.5.
You can use the source code with very minor modifications though (mostly in namespaces). It depends on which part of the toolkit you need.
Check out the source at https://github.com/xyzzer/WinRTXamlToolkit

What happened to the prism project linker in Visual Studio 2010?

How do I share files between WPF and Silverlight projects in Visual Studio 2010?
You can download Project Linker for Visual Studio 2010 in the Extension Manager. Just search for "Project Linker". It works perfectly!
The project linker download can be found here at the bottom of the page in the "Files in this Download" section:
http://www.microsoft.com/downloads/details.aspx?familyid=fa07e1ce-ca3f-4b9b-a21b-e3fa10d013dd&displaylang=en
And just in case you were also asking about its usage, here is a link to the usage information:
http://msdn.microsoft.com/en-us/library/dd458870.aspx
It doesn't appear to have been released as a self installer for VS2010. However, the code does appear to have been updated to allow the plugin to run in VS2010.
Have a look at this discusson thread. About two thirds of the way down the tread, it gets to the point where they give that link and discuss the steps for making it work. Here is the link to the source code updated for VS2010.
The steps to use the code to generate an installer that will work for you are (ripped from the linked thread):
open solution in vs2010
compile as release
add a new VSIX project (template located under c#>Extensibility).
In the VSIX project you need to add two "content" items
- a "VS Package type" as the output of the project linker project,
- a "Custom Extension" Type - as a file and browse to the compiled project linker helper dll
HTH

Resources