Run MSBuildTask from visual studio add-in - visual-studio-addins

I have a custom Visual Studio add-in that runs an IDL compiler and add the generated C# source files to the project.
My add-in runs the IDL compiler when IDL definitions are saved and also on before build event.
I want to move the execution of IDL compiler to MSBuildTask, to allow the work to be done out of the main thread, but need a way to execute my custom task from the add-in when an IDL file is saved.
The maim reason i want to run the compiler in a MSBuildTask is that this avoid the use of the main thread, and keeps Visual Studio interface responsiveness.

Related

How to create custom TFS check-in policies in .NET Core 2.0?

I'm familiar with the new deployment/installation design of VS 2017, and the way it leaves no footprint on registry.
And I'm also familiar with how we need to change our check-in policy installation from registry manipulation to VS extension creation.
However, now I need to create check-in policies in .NET Core 2.0. The problem is that I need to use Microsoft.TeamFoundation.VersionControl.Client dll to be able to access PolicyBase and also PendingChange classes. This results in FileNotFoundException.
Also I need to use Mono.Cecil as the reflection library, to be able to process things in more detail before checking-in. I can't find if Mono.Cecil supports .NET Core 2.0 or not. Nuget page is not informative and the libraries page on GitHub is also not easy to understand.
And another obstacle is to create a VS Extension. I can't find out the required package definition items to be added to source control.
Can you please provide a simple example of how to create a custom TFS Check-in Policy in VS 2017 via .NET Core 2.0?
Since the policy ends up running in the context of Visual Studio itself, I believe you have to be compatible with the .NET framework that Visual Studio is running in, and that is the "classic" .NET Framework, not .NET Core. Libraries written to a .NET Standard can potentially be consumed by both .NET Framework and .NET Core applications, and I believe you could also include separate executables in an extension and run them as separate processes if there's some piece that absolutely must run in a .NET Core environment, but you can't mix-and-match within a single process, and the extension code itself doesn't get a choice: it runs in the Visual Studio process.

Creating a F# PCL for Universal apps (a.k.a. Store Apps or Windows apps or WinRT apps)

Since Visual Studio 2013 Update 2, it is possible to create Portable Class Libraries (PCLs) that can reference Windows Runtime types (which was not possible before) as long as they only target Windows 8.1 and Windows Phone 8.1 and no other targets.
I tried this in C# by adding a C# Class Library (Portable for Universal Apps) and it works, which means that you can consume and produce Windows Runtime types as if the project was a Windows App or Windows Runtime Component.
Since F# also supports PCLs and Windows 8.1 and Windows Phone 8.1 are supported targets, I would like to achieve the same with F# PCLs (if possible). While Visual Studio 2013 Update 4 does not offer creating F# PCLs that only target Windows 8.1 and Windows Phone 8.1, it is possible to modify the .fsproj file of an F# PCL to match the .csproj file of a C# PCL with those targets that was created with Visual Studio. This requires changing the XML elements to the following:
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile32</TargetFrameworkProfile>
and adding the following to an <ItemGroup>
<TargetPlatform Include="WindowsPhoneApp, Version=8.1" />
<TargetPlatform Include="Windows, Version=8.1" />
After these changes, I was able to consume and produce Windows Runtime types in the F# PCL as in the C# PCL (without complaints from Visual Studio in the F# PCL or C# (Universal) Windows App), but when I actually run the (Universal) Windows App I get the following exception when a function that uses Windows Runtime types is called in the F# PCL from the C# (Universal) Windows App:
An exception of type 'System.IO.FileNotFoundException' occurred in
[application name].exe but was not handled in user code
Additional information: Could not load file or assembly 'Windows, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null' or one
of its dependencies. The system cannot find the file specified.
When I check the references in the Solution Explorer of Visual Studio, the C# PCL shows a reference named Windows, which is missing from the F# PCL. The Reference Properties of that reference look like this:
I tried adding this reference manually to the .fsproj file of the F# PCL by adding
<Reference Include="C:\Program Files (x86)\Microsoft SDKs\Portable\v12.0\110C4FEFF2BA61C0746933A9ED6E248D\Windows.winmd" />
to an <ItemGroup>. After this, the reference does show up in the F# PCL in the Solution Explorer with the following Reference Properties:
but does not fix the problem. That is, I still get the same exception as before.
I also tried copying and pasting the Windows reference via the context menu of the Solution Explorer of Visual Studio, but it complains with an error message.
Do you know how to properly add the Windows reference to a F# PCL? This would be really awesome, because that would make it possible to write (Universal) Windows Apps almost entirely in F#! If you know for a fact that this is not possible, then could you please explain what is preventing this from being possible?
EDIT: improved formatting of exception message
You're making a portable class library. F# does not support windows store apps, so the only way you can use F# in such a situation is to call it from C#. If you manage to succeed, you'll be the first of anyone.

Casablanca - REST C++ SDK, used in Embarcadero RAD Studio XE5

I need to do a http get in RAD Studio XE5 C++. The tutorials on the RAD Studio site discuss a RESTCLient that is not included with the version I have. I found the Casablanca project, which is specifically for Visual Studio, and I made a small program in VS that does the simple http get and handles response in the way I need.
What do I need to do to successfully use Casablanca from within RAD Studio?
There are the steps I have taken so far.
Compiled Casablanca in Visual Studio 2013
Copied the .lib and .dll over to a folder in the RAD Studio project
added that folder to the link path in the RAD Studio project
added the .lib to the project
added dll imports to classes that should be in the .lib to the .cpp I want to use the function in.
class __declspec(dllimport) http_client;
class __declspec(dllimport) filestream;
class __declspec(dllimport) producerconsumerstream;
class __declspec(dllimport) rawptrstream;
There was a OMF error, and I used a tool that came with RAD Studio to convert the .lib, that got past the error.
I don't know how to declare the dll prototype's of the functions, because the returns types are from a namespace in the library itself so they aren't recognized. http_client is an unrecognized structure.
I tried this as well without the class keyword.
DLLs that export classes are not portable across compilers. So you will not be able to use a Visual Studio compiled DLL in C++Builder if it exports classes. Either flatten the DLL interface to export plain C-style functions instead (and then use C++Builder's command-line IMPLIB tool to create an import .lib file for the DLL, do not use the .lib file created by Visual Studio), or else find another solution.
For instance, C++Builder (and Delphi) ships with Indy 10, which has a TIdHTTP component. You can use its TIdHTTP::Get() method to perform an HTTP GET request. But if you need to actually use REST, you might be better off simply upgrading your XE5 to a version that has TRESTClient available (BTW, Embarcadero's REST classes use Indy internally).

How can I put my Borland C++ Builder 6 project into Visual Studio Team Services

We are putting our existing Embarcadero Borland C++ Builder 6 projects into the new free Microsoft source control called "Visual Studio Team Services" (aka online version of TFS or Team Foundation Server formerly called Team Foundation Service).
http://www.visualstudio.com/products/what-is-visual-studio-online-vs
How can I put my code from my BCB 6 project to use it with this system.
Of course I'd prefer to have IDE integration, but as long as I have some kind of GUI I'm fine with doing source code tasks outside of the BCB IDE.
Are there any BCB files that are binary and therefore might be an issue with comparing changes?
Any ideas are greatly appreciated.
C++Builder does not have any native TFS support (not even in the latest version), let alone any VSOnline support. At least with TFS, there are third-party plugins to let C++Builder access TFS:
SourceConneXion
TFS.us
For TFS, you can also use the standard TFS client GUI. For Visual Studio Team Services, who knows.
Several files are binary, including RES and TDS, but you usually don't need to do diffs on those. You should, however, make sure to set your DFM files to Text mode, as they are set to Binary by default. DFMs are always binary in the final executable's resources, but the DFM source files can be either text or binary, and you will likely do diffs on DFMs from time to time.
you could use the visual studio shell (aka 'team explorer everywhere') to do checkins etc
and you could also use the power tools (tfpt) to give you explorer integration.

Referencing 3rd party components in Delphi 2005

I'm quite new to Delphi and I'm helping a team setting up a build server which are using Rad Studio 2005.
They have just bought DevExpress VCL and wants to use these. I would rather not have the component installed on the build server, but instead having them as a part of the source code and making sure that the project is using that version.
How is that done in Delphi?
We compiled all of our 3rd-party stuff into a BPL, then put that .bpl and corresponding .dcp and .dpr/.bdsproje into source control, so it gets delivered to the build server. Works well. In retrospect, it should have been a series of BPLs, divided by vendor, so that we could upgrade individual components/libraries without having to run regression tests on everything else.

Resources