Xamarin solution only builds with MSBuildPlatform.x86 - xamarin

I have the following question:
I'm using CakeBuild to build my Xamarin.Forms solution on a Windows computer (Windows 10).
Everything builds fine when I'm using the following command:
MSBuild("MyXamarinApp.sln", configurator =>
configurator.SetConfiguration("Debug")
.SetMSBuildPlatform(MSBuildPlatform.x86));
But if I remove "SetMSBuildPlatform(MSBuildPlatform.x86)" it uses internally "MSBuildPlatform.x64" and then I get the following error:
(_GetReferenceAssemblyPaths target) ->
C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(566,2): error MSB3644: The reference assemblies for framework "MonoAndroid,Version=v1.0" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.
Can someone explain this behaviour? Can I only use the x86 version of MSBuild to build Xamarin projects?

You need to set that platform in you Android application target. (AndroidProject -> Options).
x86 that desktop architecture. You can use it to build and test on simulator, but for a real device you will need to select at least one mobile architecture (any architecture that's not x86 or x86_64)

Related

.Net class library compilation error on build machine

I have a SDK styled .Net class library which compiles properly on my local machine, however fails on build server.
The contents of .csproj are
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net35;net40;netstandard1.0</TargetFrameworks>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<Version>1.5.6</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
</Project>
The error displayed is:
NETSDK1045: The current .NET SDK does not support targeting .NET Standard 4.0. Either target .NET Standard 2.1 or lower, or use a version of the .NET SDK that supports .NET Standard 4.0
I have .NET Core 3.1.113 installed on build server and .NET 5 installed on local machine.
Note: If I remove netstandard1.0 from TargetFrameworks then build succeeds on both the machines. However I want my library to target .net standard 1.0 as well.
I cannot understand why v4.0 is treated as .NET Standard 4.0 on build server. Can anyone let me know what the problem might be?
Remove the following line from your .csproj file:
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
This overrides the version value that the SDK infers from TargetFramework which will interfere with your definition of net3.5 and so on - you were actually building .NET Framework 4.0 twice and then override netstandard1.0 to .NET Standard (inferred TargetFrameworkIdentifier) to 4.0. Newer versions of the SDK may have different inference logic which may be a difference between 3.1 and 5.0 SDKs but this is an error in the csproj nonetheless.
If your build logic relies on TargetFrameworkVersion being defined in the project I suggest you try to change your build logic - this is VERY DANGEROUS to have in a modern csproj file where you rely on TargetFramework and TargetFrameworks (plural). You can also try to move it into a separate <PropertyGroup> with an always-fals-condition (e.g. <PropertyGroup Condition="'$(ThisIsToWorkAroundBuildScripts)' == 'True'">)
I cannot understand why v4.0 is treated as .NET Standard 4.0 on build
server. Can anyone let me know what the problem might be?
That is quite strange and I have not seen that issue before. And there is no info about .NET Standard 4.0 and I did not know why VS treats v4.0(net framework 4.0) as net standard 4.0. Maybe your there is some problems about your server environment.
Please follow these:
1) First, please use dotnet --list-sdks under CMD to check if you installed net core 2.1 sdk or any other versions. And actually, net core 2.1 sdk could support the previous sdks including net standard 1.0. Maybe you would better install net core 2.1 sdk. Also, you could install the latest Net Core 3.1 Sdk.
2) check system environment variable, and find whether there is a variable called MSBuildSDKsPath, if so, please delete it. Then, restart.
3) delete bin and obj folder under the build server. Also, I suggest you would better use Build Tool for VS to build your projects on the server rather than dotnet build. dotnet cli does not contain the tool for net framework. What's more, your project is multi-targetframeworks, it could build net core and net standard, and also you have to download net framework sdk.
That is too complex, you could install the Build Tool for VS2019(more likely a lightweight cmd which integrates dotnet, net framework, all vs environment). Also, install the Net desktop build tool and net core build tool workload, also install the related sdks.
When you finish it, delete bin and obj folder, type this under Build Tool for VS command:
msbuild xxx\xxx.csproj -t:clean,restore,build

Visual studio deploys wrong file

I have raspberry PI project on Windows IoT which have one main UWP app and couple .NET Standard 2.0 assemblies. Couple of assemblies have reference to HTTPnet nuget and this nuget internally have version for full framework, UWP and .NET Standard. In Visual studio when I expand Dependencies for HTTPnet it shows everywhere that it is using .NET standard but after deploy and run I have exception that HTTPnet.Netstandard.dll file is not found. After investigating RPI filesystem I noticed that deployed dll is HTTPnet.UniversalWindows.dll and HTTPnet.Netstandard.dll is missing.
The question is how to force using .net standard on deploy?
For now I added HTTPnet.Netstandard.dll to my UWP references but this is not good solution in long terms.

Windows RT 8.1 Sharpdevelop Issue (MSB3644) (MSB3248)

I've signed the Windows RT Desktop version of Sharpdevelop, but I continuously get this error
Build started.
Warning MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.0" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.
Error MSB3248: Parameter "SearchPaths" has invalid value "{CandidateAssemblyFiles}%3b
%3b
{HintPathFromItem}%3b
{TargetFrameworkDirectory}%3b
{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}%3b
%3b
{GAC}%3b
{RawFileName}%3b
bin\Release\System.winmd". Illegal characters in path.
Build failed. (00:00:01.5781253)
All I need to do is get the exe compiled. I can sign it separately.

How to work with C++ Windows Runtime Component and AnyCPU target?

I made a Windows Runtime Component with VS2013, using C++/CX and targeting Universal Apps. Therefore, I now have 5 DLL files:
Windows
ARM
MyLib.winmd
MyLib.dll
x86
MyLib.winmd
MyLib.dll
x64
MyLib.winmd
MyLib.dll
WindowsPhone
ARM
MyLib.winmd
MyLib.dll
x86
MyLib.winmd
MyLib.dll
My customer wants to use this library in a Windows 8.1 project. He told me that he cannot use the lib with a project targeting "AnyCPU", which is normal since each DLL is for a single platform. However, what should I tell him? How should he create his project in order to get a package working on each platform?
AnyCPU is not supported for native code, only for pure managed code.
You'll need to distribute the platform specific modules and your customer will need to target specific architectures and include the appropriate version of the component for the target architecture.
One way is to put the component in folders named for the configuration and choose the version to reference by the $configuration property.
An easy way to set this up is to distribute the component as an extension SDK which will set up the appropriate directory structure and include the matching version for the configuration. See Distributing a managed Windows Runtime component and How to: Create a Software Development Kit on MSDN (the managed doc has a good overview even for native components).
A nuget package can also achieve the same thing.

FSharp.Core for Windows Phone 7.1 and F# 3.0

The F# 2.0 distribution had a version of FSharp.Core compiled for WindowsPhone 7.1/Silverlight 4, but F# 3.0 doesn't, and the portable version only supports Silverlight 5 or Windows Phone 8. Has anyone been able to compile a version of FSharp.Core for F# 3.0 targeting Silverlight 4 or Windows Phone 7.1 from source? What are the defines required?
Edit:
On the fsharp compiler github repo, there's a target named portable-net4+sl4+wp71+win8, but in reality that's portable class library Profile47, which supposedly only support .NET 4.5, Silverlight 5.0 and Windows Store apps. It's the same as what's installed with VS2012. If you try to use it with a WP 7.1 project, it will fail at runtime complaining about missing IStructuralEquatable. It should really be named portable-net45+sl5+win8. There's a wp7 target also in the proj files, but it's currently not compiling
I managed to compile it, but since I don't normally use F#, I don't know how to test it. Have you followed the instructions for compiling? Just type the following commands in the VS Developer Prompt
cd src
msbuild fsharp-proto-build.proj
msbuild fsharp-library-build.proj
msbuild fsharp-compiler-build.proj
msbuild fsharp-library-build.proj /p:TargetFramework=portable-net4+sl4+wp71+win8
Note that I did it with Visual Studio 2012 Professional. If you want, I can send you compiled dll and you can try it.
Got both the wp7 target and Portable88 target compiling from F# source after a couple of changes https://github.com/ovatsus/fsharp
Still need to thoroughly test at runtime, though

Resources