Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7999613
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 4, 20262026-06-04T15:33:15+00:00 2026-06-04T15:33:15+00:00

I have a very similar question to this SO post: TFS Build 2010 –

  • 0

I have a very similar question to this SO post: TFS Build 2010 – Custom Binary Location and SharePoint WSP. There’s no marked answer, but the only answer provided seemed to be the path to go.

I’m building several solutions and need the solutions and projects to be placed into their own folders. This lead to the build output change to the MSBuild call in the template that I’m using. I’ve been using this for sometime without any issues.

Recently a developer complained that the .wsp files were not being generated in our daily build. I looked into this and came across the fore mentioned SO post.

I followed the instructions and now have a new error:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\SharePointTools\Microsoft.VisualStudio.SharePoint.targets (411): Method not found: ‘Boolean Microsoft.VisualStudio.SharePoint.PathUtils.HasIllegalDeploymentPathCharacters(System.String)’.

I’ve looked at this line (411) in the targets file:

<PackageFiles LayoutPath="$(LayoutPath)%(EnumeratedFiles.Package)\" PackagePath="$(BasePackagePath)%(EnumeratedFiles.Package).$(PackageExtension)" />

The PackageFiles target is defined:

<UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="PackageFiles" />

I checked the GAC and didn’t see it there so I added it. The TFS 2010 Build machine has Visual Studio 2010 and Sharepoint 2010 installed on it. I don’t think I need to do anything other than changing this task:

<CreateSharePointProjectService Configuration="$(Configuration)"
                                Platform="$(Platform)"
                                ProjectFile="$(MSBuildProjectFile)"
                                ProjectReferences="@(SharePointProjectReference)"
                                OutDir="$(TargetDir)">
  <Output PropertyName="ProjectService" TaskParameter="ProjectService" />
</CreateSharePointProjectService>

So that OutDir points to $(TargetDir).

Am I missing something as to why I’m getting this error where now a method cannot be found? This error is very exasperating as there is no information on the web regardless of the Google Fu employed!

Update
I’ve pulled apart the Microsoft.VisualStudio.SharePoint.dll that’s on the build server. There is no PathUtils class or Namespace. Could I possibly have a bad version of this file? How can I detect this? Should I install the Sharepoint SDK on the build server. It already has Sharepoint 2010 installed on it.

Update 2
I checked the GAC. The Microsoft.VisualStudio.Sharepoint assembly shows up. However, I can only find it when I’m running the x64 version of the Visual Studio Command Prompt. When I run the normal one I get no assembly back. I’m assuming that is because the Sharepoint assembly is 64 bit. As far as I know TFS is setup to be 64bit. Is this going to be my problem?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-04T15:33:16+00:00Added an answer on June 4, 2026 at 3:33 pm

    I found a solution to this issue. I don’t think anyone has ever encountered this so I’m doubtful there will be a “correct” solution. I will post here what I have done to allow my .wsp files to build in the solution.

    By all means, please post an answer (or comment on either this answer or the original question) if you think there is a better solution or if my manner of solving the problem is not up to par.

    I will explain this in steps that I came up with to solve the problem.

    First Step
    The task PackageFiles was giving me the issue. This task was unable to find a method to invoke. Looking at the file C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\SharePointTools\Microsoft.VisualStudio.SharePoint.targets we can find this on line 56:

    <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="PackageFiles" /> 
    

    I know knew where to look for the PackageFiles task/class.

    Step Two
    After knowing where to look I decompiled the task. I used Telerik’s JustDecompile but I also came up with the same code in Reflector.

    I could clearly see the line:

    if (PathUtils.HasIllegalDeploymentPathCharacters(str2))
    

    Which was erroring.

    Step Three
    I ended up deciding that the PathUtils.HasIllegalDeploymentPathCharacters method was just there as a safety check. I could recreate this task in my own custom library and then insert it into a custom targets file.

    Here was the class I came up with:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Reflection;
    using Microsoft.VisualStudio.SharePoint.Tasks;
    using Microsoft.Build.Framework;
    
    namespace SharepointTaskLibrary
    {
      public class PackageFiles : BuildTask
      {
        [Required]
        public ITaskItem LayoutPath
        {
          get;
          set;
        }
    
        [Required]
        public ITaskItem PackagePath
        {
          get;
          set;
        }
    
        public PackageFiles()
        {
    
        }
    
        protected override void OnCheckParameters()
        {
          if (this.LayoutPath == null)
          {
            throw new InvalidOperationException(Strings.GetString("LayoutPathNotSpecified"));
          }
          if (this.PackagePath == null)
          {
            throw new InvalidOperationException(Strings.GetString("PackagePathNotSpecified"));
          }
        }
    
        protected override void OnExecute()
        {
          object[] objArray;
          object[] objArray2;
          object[] objArray3;
          string metadata = this.LayoutPath.GetMetadata("FullPath");
          string str1 = this.PackagePath.GetMetadata("FullPath");
    
          Assembly sharepointTasksAss = Assembly.Load("Microsoft.VisualStudio.SharePoint.Tasks");
    
          if (sharepointTasksAss != null)
            base.Log.LogMessage(MessageImportance.High, "Found Tasks assembly!");
          else
          {
            base.Log.LogError("Couldn't find the tasks assembly");
            return;
          }
    
          if (!Directory.Exists(metadata))
          {
            base.Log.LogErrorFromResources("LayoutPathDoesNotExist", new object[] { metadata });
          }
          else
          {
            MethodInfo createCabMethod = GetStaticMethod(sharepointTasksAss, "Microsoft.VisualStudio.SharePoint.Tasks.Utilities.CabCreator", "CreateCabinet");
    
            if (createCabMethod == null)
            {
              base.Log.LogError("the method could not be retrieved on type.");
              return;
            }
            else
              base.Log.LogMessage(MessageImportance.High, "Found method: " + createCabMethod.Name);
    
            IEnumerable<string> strs = createCabMethod.Invoke(null, new object[] { metadata, str1 }) as IEnumerable<string>;
    
            /*
             * The following code would error in the original task.
             */
            //foreach (string str2 in strs)
            //{
            //  if (PathUtils.HasIllegalDeploymentPathCharacters(str2))
            //  {
            //    base.Log.LogWarningFromResources("FileNameContainsIllegalDeploymentPathCharacters", new object[] { str2 });
            //  }
            //}
            base.Log.LogMessage(MessageImportance.High, Strings.GetString("PackageCreatedSuccessfully"), new object[] { str1 });
          }
    
          Type codeMarkersType = null;
    
          try
          {
            codeMarkersType = sharepointTasksAss.GetType("Microsoft.Internal.Performance.CodeMarkers", true);
          }
          catch (Exception e)
          {
            base.Log.LogErrorFromException(e, true);
          }
    
          if (codeMarkersType == null)
          {
            base.Log.LogError("Couldn't get the CodeMarkers class!");
            return;
          }
          else
            base.Log.LogMessage(MessageImportance.High, "Found the type: " + codeMarkersType.FullName);
    
          /*
           * This has yet to be added back in.
           */
          //CodeMarkers.Instance.CodeMarker(CodeMarkerEvent.perfSharePointPackageWspPackageEnd);
        }
    
        private MethodInfo GetStaticMethod(Assembly assembly, string typeName, string methodName)
        {
          Type type = null;
    
          try
          {
            type = assembly.GetType(typeName, true);
          }
          catch (Exception e)
          {
            base.Log.LogErrorFromException(e, true);
          }
    
          if (type == null)
          {
            base.Log.LogError("Couldn't get the type: " + typeName);
            return null;
          }
          else
            base.Log.LogMessage(MessageImportance.High, "Found the type: " + type.FullName);
    
          MethodInfo methodInfo = type.GetMethod(methodName, BindingFlags.Static);
    
          if (methodInfo == null)
          {
            MethodInfo[] methods = type.GetMethods().Union(type.GetMethods(BindingFlags.Static)).ToArray();
    
            base.Log.LogWarning(string.Format("Wasn't able to find {0} directly. Searching through the static {1} method(s) on {2}", methodName, methods.Length, type.FullName));
    
            foreach (MethodInfo info in methods)
            {
              if (info.Name == methodName && methodInfo == null)
                methodInfo = info;
            }
    
            if (methodInfo == null)
            {
              MemberInfo[] members =
                      type.GetMembers().Union(type.GetMembers(BindingFlags.Static | BindingFlags.NonPublic)).Union(type.GetMembers(BindingFlags.NonPublic)).ToArray();
    
              base.Log.LogWarning(string.Format("Wasn't able to find {0}. Searching through the {1} members(s) on {2}", methodName, methods.Length, type.FullName));
    
              MemberInfo createCabMember = null;
    
              foreach (MemberInfo member in members)
              {
                if (member.Name == methodName)
                {
                  createCabMember = member;
                  break;
                }
                else
                  base.Log.LogMessage(MessageImportance.High, "Found member: " + member.Name);
              }
    
              if (createCabMember == null)
                base.Log.LogError("Still wasn't able to find " + methodName + " in the members!");
            }
          }
    
          return methodInfo;
        }
      }
    }
    

    Since most of the classes and methods are marked as internal I had to make use reflection to get the type and method needed to actually build the cab/wsp files. This is done in the method: GetStaticMethod

    Step Four
    If you read over the decompiled code and my custom version of the class you’ll notice the Strings class. It appears to be a resource accessor class. I decided that I’d just decompile that code as well and use it in my solution that makes the custom task instead of reflecting every time I wanted to access a string resource. This file ended up not being a straight decompile as it has a line this.GetType().Assembly it uses to get the current assembly containing the resources. This works fine within the original assembly but causes a problem in this custom assembly.

    The original line:

    internal Strings()
    {
        this.resources = new ResourceManager("Strings", this.GetType().Assembly);
    }
    

    This line had to be changed to:

    Assembly sharepointTasksAss = Assembly.Load("Microsoft.VisualStudio.SharePoint.Tasks");
    this.resources = new ResourceManager("Strings", sharepointTasksAss);
    

    Step Five
    After I had a custom build task that mimics the original I needed to now place that into the targets file. I then backed up the original targets file and made a custom one replacing the UsingTask section like this:

      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="CreateSharePointProjectService" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="EnumerateFiles" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="EnumerateFeature" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="EnumeratePackage" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="EnumerateProjectItem" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="LayoutFiles" />
      <!-- The next task is a mimic of the one from the other assembly.  I decompiled it and recreated it so it wouldn't error.  LOL -->
      <UsingTask AssemblyFile="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\SharePointTools\SharepointTaskLibrary.dll" TaskName="PackageFiles" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="ResolveProjectMember" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="SetPackagingProperties" />
      <UsingTask AssemblyFile="Microsoft.VisualStudio.SharePoint.Tasks.dll" TaskName="ValidatePackage" />
    

    This made the task point to my DLL which contained the custom task. Specifically, this line:

    <UsingTask AssemblyFile="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\SharePointTools\SharepointTaskLibrary.dll" TaskName="PackageFiles" />
    

    FINALLY
    I dropped the compiled DLL and edited targets file into the C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\SharePointTools directory (again backing up the original targets file).

    This allowed me to build via TFS 2010 with custom outputs the wsp files generated by the SharePoint solutions!

    I used this site as a resource:
    http://blogs.like10.com/2011/08/04/team-build-2010-customized-output-directories-sharepoint-2010-wsps/

    (I may have used another one or two sites as a resource, but I can find them in the browser history at the moment).

    Your mileage may vary, but please let me know if anyone has this similar issue and is able to fix it in a non “hacked” way.

    UPDATE
    This whole issue seems to have came from the original TFS install I was administering. I recently moved our team to a proper TFS server (2012) with a completely fresh OS install and a new database server. Once I migrated the databases over and ran the upgrade tasks in TFS I was able to do some small build edits to make my build work with 2012 and I did not encounter this issue a second time. I believe that because the original 2010 TFS was on a converted dev machine it caused this problem.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a question very similar to this, How do you build extensible data
I know that this is a repeated question. I have found very similar questions
I was looking at this post: https://stackoverflow.com/a/2262200 and I have a very similar setup
I have an error very similar to the one addressed in this question .
My question is very similar to the one described in this post: Javascript progress
I have tried my best to understand a very similar StackOverflow question , but
I have something very similar to this example: https://developers.google.com/maps/documentation/javascript/examples/directions-simple All I am trying to
This is a followup/post question to another question; as I have discovered a solution
I have c# code to sign an xml that is very similar to this
My question is very similar to Java: HTTP Post to create new "Product" in

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.