Имитация разрешения блока процесса msbuild

pcntl_fork не будет работать в среде веб-сервера, если в нем включен безопасный режим . В этом случае он будет работать только в CLI-версии PHP.

5
задан Neil 26 June 2009 в 19:36
поделиться

6 ответов

If you target the Framework version you want to be compatible with instead of targeting 3.5, Visual Studio 2008 SP1 and FxCop 1.36 RTM added rule CA 1903: Use only API from targeted framework to ensure you stay compatible with the target framework version. Turning that rule on and treating it as an error will fail your Build and provide the behavior you want.

Here is sample code demonstrating a violation when you are targeting framework version 2:

using System.Runtime;

class Program
{
    static void Main()
    {
        GCSettings.LatencyMode = GCLatencyMode.LowLatency;
    }
}
2
ответ дан 13 December 2019 в 22:14
поделиться

Чтобы напрямую имитировать процесс разрешения CLR, вы можете написать настраиваемую задачу MSBuild, хотя я не вижу, чего бы она достигла.

MSBuild не разрешает сборки. Они решаются CLR. В этой статье описывается, как среда выполнения распознает сборки: http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Когда вы находитесь в Visual Studio, системные сборки поступают из файловой системы, но когда они загружаются во время выполнения, они приходят из GAC. http://p3net.mvps.org/Topics/Basics/IntegratingGACWithVS.aspx

Если у вас все еще есть вопросы, пожалуйста, поясните.

0
ответ дан 13 December 2019 в 22:14
поделиться

Это должно показать вам, как делать то, что вы действительно хотите, но я думаю, вам следует использовать предоставленный мной ответ FXCop.

static void Main()
    {
        string targetFile = @"test.csproj";
        XDocument xmlDoc = XDocument.Load(targetFile);
        XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";

        var references = from reference in xmlDoc.Descendants(ns + "ItemGroup").Descendants(ns + "Reference")
                         select reference.Attribute("Include").Value;

        foreach (var reference in references)
        {
            Assembly.LoadWithPartialName(reference);
        }

        foreach (var item in AppDomain.CurrentDomain.GetAssemblies())
        {
            var assemblyVersion = ((AssemblyFileVersionAttribute)item.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true)[0]).Version.ToString();
            Console.WriteLine("\r\nFullname:\t{0}\r\nFileVersion:\t{1}", item.FullName, assemblyVersion);

        }
        Console.WriteLine("\r\nPress any key to continue");
        Console.ReadKey();
    }
2
ответ дан 13 December 2019 в 22:14
поделиться

Если вы получите бесплатную копию Reflector , вы можете изучить внутреннюю часть самого файла MSBuild.exe. Я заметил, что есть класс

Microsoft.Build.Shared.TypeLoader

, который имеет метод под названием

internal LoadedType Load(string typeName, AssemblyLoadInfo assembly);

, который может помочь?

В любом случае, с помощью отражателя вы можете получить код и, надеюсь, повторно использовать систему напрямую.

1
ответ дан 13 December 2019 в 22:14
поделиться
0
ответ дан 13 December 2019 в 22:14
поделиться

Почему бы просто не вызвать msbuild для вашего проекта или файла решения, передать ему расширение / v: d и проанализировать выходной файл для получения нужной информации? Например, для каждого разрешения сборки вы увидите что-то вроде следующего:

  Primary reference "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
      Resolved file path is "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.dll".
      Reference found at search path location "{TargetFrameworkDirectory}".
          For SearchPath "{TargetFrameworkDirectory}".
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.exe", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.dll", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.exe", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.exe", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.exe", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.exe", but it didn't exist.
      This reference is not "CopyLocal" because it's a prerequisite file.

В качестве альтернативы MSBuild делегирует задачу разрешения сборок классу Microsoft.Build.Tasks.ResolveAssemblyReference из сборки Microsoft.Build.Tasks.v3.5 (в моем случае построение против фреймворка 3.5). Вы можете проанализировать файл проекта и предоставить экземпляр ResolveAssemblyReference с соответствующими (мета) данными, и позволить ему выполнить разрешение за вас - кажется идеальным, поскольку это именно то, что делает MSBuild.

передать ему расширение / v: d и проанализировать выходной файл для получения нужной информации? Например, для каждого разрешения сборки вы увидите что-то вроде следующего:

  Primary reference "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
      Resolved file path is "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.dll".
      Reference found at search path location "{TargetFrameworkDirectory}".
          For SearchPath "{TargetFrameworkDirectory}".
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.exe", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.dll", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.exe", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.exe", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.exe", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.exe", but it didn't exist.
      This reference is not "CopyLocal" because it's a prerequisite file.

В качестве альтернативы MSBuild делегирует задачу разрешения сборок классу Microsoft.Build.Tasks.ResolveAssemblyReference из сборки Microsoft.Build.Tasks.v3.5 (в моем случае построение на основе 3.5). Вы можете проанализировать файл проекта и предоставить экземпляр ResolveAssemblyReference с соответствующими (мета) данными, и позволить ему выполнить разрешение за вас - кажется идеальным, поскольку это именно то, что делает MSBuild.

передать ему расширение / v: d и проанализировать выходной файл для получения нужной информации? Например, для каждого разрешения сборки вы увидите что-то вроде следующего:

  Primary reference "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
      Resolved file path is "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.dll".
      Reference found at search path location "{TargetFrameworkDirectory}".
          For SearchPath "{TargetFrameworkDirectory}".
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.exe", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.dll", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.exe", but it didn't exist.
          Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.exe", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.exe", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.dll", but it didn't exist.
          Considered "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.exe", but it didn't exist.
      This reference is not "CopyLocal" because it's a prerequisite file.

В качестве альтернативы MSBuild делегирует задачу разрешения сборок классу Microsoft.Build.Tasks.ResolveAssemblyReference из сборки Microsoft.Build.Tasks.v3.5 (в моем случае построение против фреймворка 3.5). Вы можете проанализировать файл проекта и предоставить экземпляр ResolveAssemblyReference с соответствующими (мета) данными, и позволить ему выполнить разрешение за вас - кажется идеальным, поскольку это именно то, что делает MSBuild.

MSBuild делегирует задачу разрешения сборок классу Microsoft.Build.Tasks.ResolveAssemblyReference из сборки Microsoft.Build.Tasks.v3.5 (в моем случае построение на основе платформы 3.5). Вы можете проанализировать файл проекта и предоставить экземпляр ResolveAssemblyReference с соответствующими (мета) данными, и позволить ему выполнить разрешение за вас - кажется идеальным, поскольку это именно то, что делает MSBuild.

MSBuild делегирует задачу разрешения сборок классу Microsoft.Build.Tasks.ResolveAssemblyReference из сборки Microsoft.Build.Tasks.v3.5 (в моем случае построение на основе платформы 3.5). Вы можете проанализировать файл проекта и предоставить экземпляр ResolveAssemblyReference с соответствующими (мета) данными, и позволить ему выполнить разрешение за вас - кажется идеальным, поскольку это именно то, что делает MSBuild.

2
ответ дан 13 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: