diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2014-04-01 15:01:48 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@xamarin.com> | 2014-04-01 15:01:48 +0400 |
commit | c063a2372868cca03c32082551165973cb4da298 (patch) | |
tree | a01ef92359a2755a8d9e53fa1f28a7e46e6a23c6 /main/src/core/MonoDevelop.Core | |
parent | e57b52f673ef75ef7597ce195af6d89dc2761950 (diff) |
[Core] Improve support for shared assets projects
Moved classes for handling shared projects to its own namespace.
Added extensions for handling shared project references.
Diffstat (limited to 'main/src/core/MonoDevelop.Core')
7 files changed, 363 insertions, 86 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml index 6562e0e5d8..6882767eba 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.addin.xml @@ -146,7 +146,7 @@ </ExtensionPoint> <ExtensionPoint path = "/MonoDevelop/ProjectModel/MSBuildExtensions" name = "MSBuild Extensions"> - <ExtensionNode objectType="MonoDevelop.Projects.Formats.MSBuild.MSBuildExtension"/> + <ExtensionNode name="Class" objectType="MonoDevelop.Projects.Formats.MSBuild.MSBuildExtension"/> </ExtensionPoint> <ExtensionPoint path = "/MonoDevelop/ProjectModel/MonoDocSources" name = "MonoDoc Sources"> @@ -274,10 +274,16 @@ type = "MonoDevelop.Projects.CompiledAssemblyProject" handlerType = "MonoDevelop.Projects.Formats.MSBuild.CompiledAssemblyProjectMSBuildHandler" /> <SolutionItem guid = "{D954291E-2A0B-460D-934E-DC6B0785DB48}" - type = "MonoDevelop.Projects.SharedProject" - handlerType = "MonoDevelop.Projects.Formats.MSBuild.SharedProjectMSBuildHandler" /> + type = "MonoDevelop.Projects.SharedAssetsProjects.SharedAssetsProject" + extension = "shproj" + handlerType = "MonoDevelop.Projects.SharedAssetsProjects.SharedAssetsProjectMSBuildHandler" /> </Extension> - + + <Extension path = "/MonoDevelop/ProjectModel/MSBuildExtensions"> + <Class class="MonoDevelop.Projects.SharedAssetsProjects.SharedAssetsProjectMSBuildExtension"/> + </Extension> + + <!-- Some info from: http://www.mztools.com/articles/2008/mz2008017.aspx diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj index 1874e0e000..c9b76ad979 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj @@ -456,9 +456,10 @@ <Compile Include="MonoDevelop.Core.Logging\AssertLoggingTraceListener.cs" /> <Compile Include="MonoDevelop.Projects.Formats.MD1\MD1ProjectService.cs" /> <Compile Include="MonoDevelop.Projects\UnknownProject.cs" /> - <Compile Include="MonoDevelop.Projects\SharedProject.cs" /> - <Compile Include="MonoDevelop.Projects.Formats.MSBuild\SharedProjectMSBuildHandler.cs" /> <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildExtension.cs" /> + <Compile Include="MonoDevelop.Projects.SharedAssetsProjects\SharedAssetsProject.cs" /> + <Compile Include="MonoDevelop.Projects.SharedAssetsProjects\SharedAssetsProjectMSBuildExtension.cs" /> + <Compile Include="MonoDevelop.Projects.SharedAssetsProjects\SharedAssetsProjectMSBuildHandler.cs" /> </ItemGroup> <ItemGroup> <None Include="Makefile.am" /> @@ -563,6 +564,7 @@ </ItemGroup> <ItemGroup> <Folder Include="MonoDevelop.Core.Web\" /> + <Folder Include="MonoDevelop.Projects.SharedAssetsProjects\" /> </ItemGroup> <Target Name="BeforeBuild" Inputs="BuildVariables.cs.in; ..\..\..\..\version.config" Outputs="BuildVariables.cs"> <Csc Sources="BuildVariables.gen.cs" OutputAssembly="BuildVariables.gen.exe" /> diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SharedProjectMSBuildHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SharedProjectMSBuildHandler.cs deleted file mode 100644 index c64e3a6b0c..0000000000 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/SharedProjectMSBuildHandler.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -// SharedProjectMSBuildHandler.cs -// -// Author: -// Lluis Sanchez <lluis@xamarin.com> -// -// Copyright (c) 2014 Xamarin Inc -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; - -namespace MonoDevelop.Projects.Formats.MSBuild -{ - public class SharedProjectMSBuildHandler: MSBuildProjectHandler - { - public SharedProjectMSBuildHandler () - { - } - } -} - diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs new file mode 100644 index 0000000000..76de963cba --- /dev/null +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs @@ -0,0 +1,128 @@ +// +// SharedProject.cs +// +// Author: +// Lluis Sanchez <lluis@xamarin.com> +// +// Copyright (c) 2014 Xamarin Inc +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.Linq; +using System.Collections.Generic; +using MonoDevelop.Core; +using System.IO; + +namespace MonoDevelop.Projects.SharedAssetsProjects +{ + public class SharedAssetsProject: Project + { + Solution currentSolution; + + public SharedAssetsProject () + { + } + + public string DefaultNamespace { get; set; } + + public override string ProjectType { + get { + return "SharedAssets"; + } + } + + public override string[] SupportedLanguages { + get { + return new [] {"C#"}; + } + } + + protected override BuildResult OnBuild (MonoDevelop.Core.IProgressMonitor monitor, ConfigurationSelector configuration) + { + return new BuildResult (); + } + + internal protected override bool OnGetCanRunTarget (string target, ConfigurationSelector configuration) + { + return false; + } + + protected override void OnBoundToSolution () + { + if (currentSolution != null) { + currentSolution.ReferenceAddedToProject -= HandleReferenceAddedToProject; + currentSolution.ReferenceRemovedFromProject -= HandleReferenceRemovedFromProject; + } + + base.OnBoundToSolution (); + + ParentSolution.ReferenceAddedToProject += HandleReferenceAddedToProject; + ParentSolution.ReferenceRemovedFromProject += HandleReferenceRemovedFromProject; + currentSolution = ParentSolution; + } + + public override void Dispose () + { + base.Dispose (); + if (currentSolution != null) { + currentSolution.ReferenceAddedToProject -= HandleReferenceAddedToProject; + currentSolution.ReferenceRemovedFromProject -= HandleReferenceRemovedFromProject; + } + } + + void HandleReferenceRemovedFromProject (object sender, ProjectReferenceEventArgs e) + { + if (e.ProjectReference.ReferenceType == ReferenceType.Project && e.ProjectReference.Reference == Name) { + foreach (var f in Files) { + var pf = e.Project.GetProjectFile (f.FilePath); + if ((pf.Flags & ProjectItemFlags.DontPersist) != 0) + e.Project.Files.Remove (pf.FilePath); + } + } + } + + void HandleReferenceAddedToProject (object sender, ProjectReferenceEventArgs e) + { + if (e.ProjectReference.ReferenceType == ReferenceType.Project && e.ProjectReference.Reference == Name) { + e.ProjectReference.Flags = ProjectItemFlags.DontPersist; + foreach (var f in Files) { + var cf = (ProjectFile) f.Clone (); + cf.Flags |= ProjectItemFlags.DontPersist | ProjectItemFlags.Hidden; + e.Project.Files.Add (cf); + e.ProjectReference.SetItemsProjectPath (Path.ChangeExtension (FileName, ".projitems")); + } + } + } + } + + internal static class SharedAssetsProjectExtensions + { + public static string GetItemsProjectPath (this ProjectReference r) + { + return (string) r.ExtendedProperties ["MSBuild.SharedAssetsProject"]; + } + + public static void SetItemsProjectPath (this ProjectReference r, string path) + { + r.ExtendedProperties ["MSBuild.SharedAssetsProject"] = path; + } + } +} + diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs new file mode 100644 index 0000000000..dc9f56214b --- /dev/null +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildExtension.cs @@ -0,0 +1,92 @@ +// +// SharedAssetsProjectMSBuildExtension.cs +// +// Author: +// Lluis Sanchez Gual <lluis@xamarin.com> +// +// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using System.Linq; +using System.IO; +using MonoDevelop.Core; +using System.Collections.Generic; +using MonoDevelop.Projects.Formats.MSBuild; + +namespace MonoDevelop.Projects.SharedAssetsProjects +{ + class SharedAssetsProjectMSBuildExtension: MSBuildExtension + { + public override void LoadProject (IProgressMonitor monitor, SolutionEntityItem item, MSBuildProject msproject) + { + base.LoadProject (monitor, item, msproject); + + var dnp = item as DotNetProject; + if (dnp == null) + return; + + foreach (var sp in msproject.Imports.Where (im => im.Label == "Shared" && im.Project.EndsWith (".projitems"))) { + var projitemsFile = sp.Project; + if (!string.IsNullOrEmpty (projitemsFile)) { + projitemsFile = MSBuildProjectService.FromMSBuildPath (item.ItemDirectory, projitemsFile); + projitemsFile = Path.Combine (Path.GetDirectoryName (msproject.FileName), projitemsFile); + if (File.Exists (projitemsFile)) { + MSBuildSerializer iser = Handler.CreateSerializer (); + iser.SerializationContext.BaseFile = projitemsFile; + iser.SerializationContext.ProgressMonitor = monitor; + MSBuildProject p = new MSBuildProject (); + p.Load (projitemsFile); + Handler.LoadProjectItems (p, iser, ProjectItemFlags.Hidden | ProjectItemFlags.DontPersist); + var r = new ProjectReference (ReferenceType.Project, Path.GetFileNameWithoutExtension (projitemsFile)); + r.Flags = ProjectItemFlags.DontPersist; + r.SetItemsProjectPath (projitemsFile); + dnp.References.Add (r); + } + } + } + } + + public override void SaveProject (IProgressMonitor monitor, SolutionEntityItem item, MSBuildProject project) + { + base.SaveProject (monitor, item, project); + var dnp = item as DotNetProject; + if (dnp == null) + return; + HashSet<string> validProjitems = new HashSet<string> (); + foreach (var r in dnp.References.Where (rp => rp.ReferenceType == ReferenceType.Project)) { + var ip = r.GetItemsProjectPath (); + if (!string.IsNullOrEmpty (ip)) { + ip = MSBuildProjectService.ToMSBuildPath (item.ItemDirectory, ip); + validProjitems.Add (ip); + if (!project.Imports.Any (im => im.Project == ip)) { + var im = project.AddNewImport (ip); + im.Label = "Shared"; + im.Condition = "Exists('" + ip + "')"; + } + } + } + foreach (var im in project.Imports) { + if (im.Label == "Shared" && im.Project.EndsWith (".projitems") && !(validProjitems.Contains (im.Project))) + project.RemoveImport (im.Project); + } + } + } +} + diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs new file mode 100644 index 0000000000..cd8097027e --- /dev/null +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProjectMSBuildHandler.cs @@ -0,0 +1,129 @@ +// +// SharedProjectMSBuildHandler.cs +// +// Author: +// Lluis Sanchez <lluis@xamarin.com> +// +// Copyright (c) 2014 Xamarin Inc +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using System.Linq; +using System.Xml; +using System.IO; +using MonoDevelop.Core; +using System.Collections.Generic; +using MonoDevelop.Projects.Formats.MSBuild; + +namespace MonoDevelop.Projects.SharedAssetsProjects +{ + class SharedAssetsProjectMSBuildHandler: MSBuildProjectHandler + { + string projitemsFile; + + public SharedAssetsProjectMSBuildHandler () + { + } + + protected override void LoadProject (IProgressMonitor monitor, MSBuildProject msproject) + { + var doc = msproject.Document; + projitemsFile = null; + foreach (var no in doc.DocumentElement.ChildNodes) { + var im = no as XmlElement; + if (im != null && im.LocalName == "Import" && im.GetAttribute ("Label") == "Shared") { + projitemsFile = im.GetAttribute ("Project"); + break; + } + } + if (projitemsFile == null) + return; + + projitemsFile = Path.Combine (Path.GetDirectoryName (msproject.FileName), projitemsFile); + + MSBuildProject p = new MSBuildProject (); + p.Load (projitemsFile); + + MSBuildSerializer ser = CreateSerializer (); + ser.SerializationContext.BaseFile = EntityItem.FileName; + ser.SerializationContext.ProgressMonitor = monitor; + + Item.SetItemHandler (this); + + var cp = p.PropertyGroups.FirstOrDefault (g => g.Label == "Configuration"); + if (cp != null) + ((SharedAssetsProject)EntityItem).DefaultNamespace = cp.GetPropertyValue ("Import_RootNamespace"); + + LoadProjectItems (p, ser, ProjectItemFlags.None); + } + + protected override MSBuildProject SaveProject (IProgressMonitor monitor) + { + MSBuildSerializer ser = CreateSerializer (); + ser.SerializationContext.BaseFile = EntityItem.FileName; + ser.SerializationContext.ProgressMonitor = monitor; + + MSBuildProject projitemsProject = new MSBuildProject (); + MSBuildProject msproject = new MSBuildProject (); + + var newProject = EntityItem.FileName == null || !File.Exists (EntityItem.FileName); + if (newProject) { + var import = msproject.AddNewImport (@"$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"); + import.Condition = @"Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"; + msproject.AddNewImport (@"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props"); + msproject.AddNewImport (@"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props"); + import = msproject.AddNewImport (Path.ChangeExtension (EntityItem.FileName.FileName, ".projitems")); + import.Label = "Shared"; + msproject.AddNewImport (@"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets"); + } else { + msproject.Load (EntityItem.FileName); + } + + // having no ToolsVersion is equivalent to 2.0, roundtrip that correctly + if (ToolsVersion != "2.0") + msproject.ToolsVersion = ToolsVersion; + else if (string.IsNullOrEmpty (msproject.ToolsVersion)) + msproject.ToolsVersion = null; + else + msproject.ToolsVersion = "2.0"; + + if (projitemsFile == null) + projitemsFile = Path.ChangeExtension (EntityItem.FileName, ".projitems"); + if (File.Exists (projitemsFile)) { + projitemsProject.Load (projitemsFile); + } else { + var grp = projitemsProject.AddNewPropertyGroup (true); + grp.SetPropertyValue ("MSBuildAllProjects", "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)", false); + grp.SetPropertyValue ("HasSharedItems", "true", false); + grp.SetPropertyValue ("SharedGUID", EntityItem.ItemId, false); + + grp = projitemsProject.AddNewPropertyGroup (true); + grp.Label = "Configuration"; + grp.SetPropertyValue ("Import_RootNamespace", ((SharedAssetsProject)EntityItem).DefaultNamespace, false); + } + + SaveProjectItems (monitor, new MSBuildFileFormatVS12 (), ser, projitemsProject, "$(MSBuildThisFileDirectory)"); + + projitemsProject.Save (projitemsFile); + + return msproject; + } + } +} + diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SharedProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SharedProject.cs deleted file mode 100644 index 86d0f0376f..0000000000 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SharedProject.cs +++ /dev/null @@ -1,43 +0,0 @@ -// -// SharedProject.cs -// -// Author: -// Lluis Sanchez <lluis@xamarin.com> -// -// Copyright (c) 2014 Xamarin Inc -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; - -namespace MonoDevelop.Projects -{ - public class SharedProject: DotNetProject - { - public SharedProject (): base ("C#") - { - } - - public override string[] SupportedLanguages { - get { - return new [] {"C#"}; - } - } - } -} - |