I am currently working on porting an existing wpf app to a universal windows app.
The existing application is fairly simple and is structured as a normal wpf project, containing the ui layer and filesystem interactions, and a class library containing the main application logic.
I was able to transfer the class library to a Universal Windows Library (windows 10 sdk) without making any substantial changes. This Universal Windows library exists in its own project inside the same solution as the original wpf application.
In order to minimize complexity, I would like both the upcoming Universal Windows app and the wpf app to reference the same library. However I am unable to add a reference to the universal Windows library from my wpf project. The library appears in the "add reference" dialog in visual studio, but after selecting the library and clicking OK, I am presented with a message saying that the reference could not be added.
Is what I am trying to do currently not possible, or is there something I'm missing? It seems foolish to need to save the same code into two different library projects for it to be usable.
You should be able to select the target frameworks of the class library by right clicking the project > Properties > Library and under targeting hit change, and select .Net framework X on your machine. Then, (aside from incompatible API's in your PCL) you'll be able to reference the project
Related
I've found a few examples, as I in a Xamarin.Native use a Windows UWP. But that would mean that I a Xamarin.Nativ in a Windows UWP Convert.
I would like convert a finished Windows UWP application to the target Android or iOS. Is that generally supported or needs my UWP application rebuild again with Xamarin?
Links:
Adding a Universal Windows Platform (UWP) App
Getting Started with Xamarin.Forms 2.0’s Windows 10 Preview
Unfortunately asfar as I know there is no converter that allows to convert UWP app to Android app straight forward.
There are few ways to make the whole process a lot much more easier (so you can create your Android app faster).
If you wrote your UWP application and separated common code that can be used in the other applications you can also use it in Xamarin.Android app - the best way is to have PCL with the common code.
It is also important which type of Xamarin app you would like to create:
1) Xamarin Forms - common UI for each app: Windows, Android and iOS.
There is one shared code that can be used by them. Remember that Xamarin Forms apps are generally speaking the best for displaying the data and they are limited with reference to platform specific functionality.
Please see below to read more:
https://docs.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/sharing_code_options/
2) Xamarin.Platfrom (so Xamarin.Android and Xamarin.iOS):
Here you can create native UI foreach of the project (Windows, Android and iOS) and access specific platform functionality.
With reference to the code - you can put common code in one PCL and have access to it from each project.
Please see this site - here you can find different Xamarin options to create cross-platfrom apps:
https://developer.xamarin.com/
Firstly, if you want a shared code, using Portable class library, you can use the same code for all the platforms including WPF, Android and iOS. First of all what you can do is convert the codes that is used again and again in the PCL (Portable Class Lirary). Once you get used to PCL, you can easily work on any platform you want.
As the Android, iOS are different from windows, a lot of .net framework functionality is not supported in PCL. Although, once you create the basics in PCL, you can integrate the class library in android as well as iOS.
I've created a Windows Store App that's running on a tablet that has Windows 8.1 as it's operating system. This app needs to print reports so I've created a report using Crystal Reports For Visual Studio. Because the Windows Store App and Windows Forms projects are on two different frameworks within the same solution, I've not been able to reference each project directly like I would in a normal solution.
I have managed to pass values between the Windows Store App project and Windows Forms project by using a Portable Class Library... but now the problem I am hitting is how to call a method that prints the report from Windows Store to the report located in Windows Forms?
I've tried referencing the Portable Class Library from my Windows Forms project but I get a circular dependency exception... which makes sense. I've further tried creating another Portable Class Library to call the Windows Forms method... but apparently Portable Class Libraries can only reference other Portable Class Libraries.
Surely their has to be a way to do this? Any suggestions would be greatly appreciated!
Windows Store App in C# and Windows Form Application use different .NET Framework, so you can not reference a Windows Form project in Windows Store App project.
Portable Class Libraries could not resolve the communication problem between 2 types of project. The possible solution is using the communication framework like WCF.
I have to create a library which i would like to reference in other project. However I would like to include in other projects. So basically when there is a button click I have to switch to the application pages created by my library. Is there any way to do this kind of project in windows phone SDK. I am using visual studio 2012 for windows sdk 8.
You can create this kind of an library using the standard Windows Phone Class Library -project. You can add pages and classes to this project as if it was a regular Windows Phone Application-project. To navigate to page which resides inside a class library, use the examples provided in here: http://www.geekchamp.com/tips/wp7-navigating-to-a-page-in-different-assembly
Example:
We have created a simple class library which contains pages for dealing with PayPal payments. We reuse this component in few of our apps. The library contains few pages:
When we want to use that library in our app, we just reference the DLL. After that, we just have to navigate the user to the correct Uri:
frame.Navigate(new Uri(string.Format("/Adafy.Payment.Client.WindowsPhone;component/Pages/ProductDescription.xaml?productId={0}", productId), UriKind.Relative));
Usually it is recommended to have two projects for both wp7 and wp8 platforms. Wp7 project contains .cs and .xaml files, and WP8 project contains links to that files.
I think that there is no reason to compile non-platform specific business logic code twice, since it can be referenced to WP8 project.
I'm thinking about following solution structure:
Business logic dll compiled for wp7 (not a PCL)
UI comliled for wp8
UI comliled for wp7
Such application can be compiled and I can deploy it to device/emulator.
The question is: will this app pass certification in Windows phone store? Or it is necessary to recompile shared dll?
UPD:
My crazy idea was born after this steps:
Create new WP7 app (WindowsPhoneApplication1)
Create class library targeted to WP7 (WindowsPhoneClassLibrary1) Use it in WindowsPhoneApplication1
Use Upgrade to WP8 menu. WindowsPhoneApplication1 will be updated to WP8, but the referenced project will be still targeted to WP7!
Such app can be deployed to WP8 devices.
Unless you use a Portable Class Library, you'll need to have separate project files, and compile separately for WP7 and WP8.
Thanks to Claus,
I made some research, and it looks like the answer is - you can use such solution.
I didn't find related information in documentation, but here is a proof from one of MSFT tech. evangelists from Netherlands: link to blogpost
The basic idea is to move all our code that can be used from both our existing Windows Phone 7 app as well as the Windows Phone 8 build, which we will add soon, to a Common project in the solution. The bad thing about this approach is that we have to create the Common project as a Windows Phone 7 class library, which will be used in our Windows Phone 8 build. I haven’t really noticed any negative impact of this decision in my existing apps, but note that you will be referencing a Windows Phone 7 library in your Windows Phone 8 build.
So it is a possible, but not the best solution.
I'm working in constrained environment (win7 under VirtualBox), and everything works excellent, except emulator (debug on real phone is OK). But I'm new to Visual Studio and .NET, and would like to develop all logic (at least interaction with web, algorithms, data models) in separate library (to test it against simple console or WPF application).
But here problems come — WP7 library uses special solution (and all projects by default are built against .NET Framework 4, when phone runs with .NET CF 3.7, why?). How I should setup IDE, to build crossplatform (I mean desktop/windows phone 7) library?
You can create parallel projects (one for desktop, one for phone) and add your c# files to one of them and link them in the other project.
To add a link to a file instead of copying it follow these steps:
Right click on the project => add existing item -> Select the file -> click the drop down arrow next to the "Add" button and chose "Add as Link".
To solve any incompatibility you can define a conditional compilation symbol like PHONE and wrap your incompatible code in:
#if PHONE
//phone code
#else
//desktop code
#endif
The downside is after you add a new code file in a project you need to link it from the corespondent project of the other platform.
I don't think there is a easier way of doing this.
You could use the MVVM pattern to develop your viewmodels (the business logic) in one assembly, then when you are ready for the UI, you can create a WP7 project and create the views inside that project, referencing the view models in the first project.
This would allow you to unit test and develop all your logic first, then just create the views and bind to the appropriate properties on the appropriate viewmodels.
MVVM was designed to be able to develop like this, so it works really well IMHO.
An acquaintance of mine suggested to use Portable Library Tools, which allows creation portable library for multiple target platforms (xbox, winphone7, silverlight, etc) without recompilation. Looks very promising.