Konstantin Koch 8287c54432 Included the Visual Studio extension and made the necessary changes to make it run.
Replaced the old VS templates with ones that offer more flexiblity.
Started replacing the Content Project for the samples with our custom project type.
Inlcuded a basic not yet working AssimpImporter.
2015-04-08 14:50:03 +02:00

109 lines
3.7 KiB
C#

/* ****************************************************************************
*
* Copyright (c) Microsoft Corporation.
*
* This source code is subject to terms and conditions of the Apache License, Version 2.0. A
* copy of the license can be found in the License.html file at the root of this distribution. If
* you cannot locate the Apache License, Version 2.0, please send an email to
* vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
* by the terms of the Apache License, Version 2.0.
*
* You must not remove this notice, or any other, from this software.
*
* ***************************************************************************/
using System;
using Microsoft.VisualStudio.Shell.Interop;
using ErrorHandler = Microsoft.VisualStudio.ErrorHandler;
namespace Microsoft.VisualStudio.Project.Automation
{
/// <summary>
/// Helper class that handle the scope of an automation function.
/// It should be used inside a "using" directive to define the scope of the
/// automation function and make sure that the ExitAutomation method is called.
/// </summary>
public class AutomationScope : IDisposable
{
private IVsExtensibility3 extensibility;
private bool inAutomation;
private static volatile object Mutex;
private bool isDisposed;
/// <summary>
/// Initializes the <see cref="AutomationScope"/> class.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")]
static AutomationScope()
{
Mutex = new object();
}
/// <summary>
/// Defines the beginning of the scope of an automation function. This constuctor
/// calls EnterAutomationFunction to signal the Shell that the current function is
/// changing the status of the automation objects.
/// </summary>
public AutomationScope(IServiceProvider provider)
{
VsUtilities.ArgumentNotNull("provider", provider);
extensibility = provider.GetService(typeof(EnvDTE.IVsExtensibility)) as IVsExtensibility3;
if (null == extensibility)
{
throw new InvalidOperationException();
}
ErrorHandler.ThrowOnFailure(extensibility.EnterAutomationFunction());
inAutomation = true;
}
/// <summary>
/// Ends the scope of the automation function. This function is also called by the
/// Dispose method.
/// </summary>
public void ExitAutomation()
{
if (inAutomation)
{
ErrorHandler.ThrowOnFailure(extensibility.ExitAutomationFunction());
inAutomation = false;
}
}
/// <summary>
/// Gets the IVsExtensibility3 interface used in the automation function.
/// </summary>
public IVsExtensibility3 Extensibility
{
get { return extensibility; }
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
#region IDisposable Members
private void Dispose(bool disposing)
{
if (!this.isDisposed)
{
lock (Mutex)
{
if (disposing)
{
ExitAutomation();
}
this.isDisposed = true;
}
}
}
#endregion
}
}