Мой проект строится с помощью MSBuild 4, но не с помощью MSBuild 3.5, хотя я ориентируюсь на ту же версию .NET Framework (3.5)?

Когда я создаю свое решение с помощью MSBuild 4, оно успешно компилируется:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe MySolution.sln

Сборка выполнена.

0 Warning(s)
0 Error(s)

Но когда я пытаюсь сделать то же самое с помощью MSBuild 3.5, я получаю следующую ошибку, несмотря на то, что источник тот же, и я использую те же библиотеки и ту же версию .NET Framework.

C: \ Windows \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe MySolution.sln

ошибка CS1501: нет перегрузки для метода «InitializeClientContextFromStringSid», принимающего аргументы «2»

ошибка CS1501: нет перегрузки для метода GetRoles, принимающего аргументы "0"

Ошибка, которую я получаю, связана с диспетчером авторизации (AzMan).

Метод InitializeClientContextFromStringSid в первой ошибке принадлежит общедоступному интерфейсу IAzApplication, члену Microsoft.Interop.Security.AzRoles.

Метод GetRoles во второй ошибке принадлежит общедоступному интерфейсу IAzClientContext, который также является членом Microsoft.Interop.Security.AzRoles.

Я использую методы следующим образом:

var clientContext = _azApplication.InitializeClientContextFromStringSid(member, 0);

где член переменной - это строка, содержащая идентификатор безопасности Windows Active Directory от пользователя, а _azApplication имеет тип IAzApplication.

clientContext.GetRoles()

где clientContext имеет тип IAzClientContext.

Почему мое решение строится с использованием MSBuild 4, но не MSBuild 3.5, хотя я ориентируюсь на ту же версию .NET Framework (3.5)?


person macrobug    schedule 30.11.2010    source источник


Ответы (1)


Похоже, что InitializeClientContextFromStringSid имеет необязательный параметр в спецификации. Хотя MSBuild в .Net Framework 4.0 поддерживает использование дополнительных параметров в C #, позволяя исключить их из вызова функции, предыдущие версии MSBuild не поддерживают этот подход. Таким образом, вы должны указать параметр, даже если он не используется при сборке со старой версией Framework.

HRESULT InitializeClientContextFromStringSid(
  [in]            BSTR SidString,
  [in]            LONG lOptions,
  [in, optional]  VARIANT varReserved,
  [out]           IAzClientContext **ppClientContext
);

Та же проблема возникает с GetRolesmethod.

Насколько я понимаю, причина, по которой вы можете создавать с использованием версии MSBuild 4.0 и целевой платформы 3.5 Framework, заключается в том, что среда CLR уже поддерживала использование дополнительных параметров, например, VB.NET всегда поддерживал их. Однако при использовании MSBuild 3.5 он будет использовать более старые правила / спецификации, которые не разрешали поддержку дополнительных параметров в C #, и, таким образом, будут вызывать ошибки сборки.

person Goronmon    schedule 30.11.2010
comment
Привет, Горонмон, спасибо за попытку мне помочь. Но проблема в том, что я не использую .NET 4.0. В обоих случаях я использую .NET 3.5. - person macrobug; 30.11.2010
comment
Если вы используете MSBuild под 4.0, он будет компилироваться в соответствии с этой спецификацией. Попробуйте использовать фиктивные переменные в качестве дополнительных параметров для этих двух функций и посмотрите, компилируются ли они с помощью версии 3.5 MSBuild. - person Goronmon; 30.11.2010
comment
Да, компилируется. Но почему он ведет себя по-разному в зависимости от версии MSBuild, которую я использую, если для Target Framework установлено значение 3.5? Я думал, что он будет компилироваться точно так же, независимо от версии MSBuild, которую я использую. Если я чего-то не упускаю. - person macrobug; 30.11.2010
comment
Поддержка использования дополнительных параметров в C # была добавлена ​​в .Net Framework 4.0. Однако необязательные параметры технически уже поддерживались в VB.net, поэтому вы можете настроить таргетинг на Framework 3.5 и по-прежнему использовать необязательные параметры, поскольку среда CLR всегда их поддерживала. Однако MSBuild в версии 3.5 будет использовать старые правила / спецификации для C #, которые неправильно поддерживают необязательные параметры и, таким образом, вызывают ошибки компиляции. - person Goronmon; 30.11.2010
comment
Итак, как вы думаете, это ошибка в MSBuild 4, которая позволяет нам использовать необязательные параметры с C # в .NET 3.5? - person macrobug; 30.11.2010
comment
Это не ошибка. Как я уже сказал, .NET Framework технически всегда поддерживает необязательные параметры, например, с VB.NET. Однако предыдущие компиляторы для C # этого не делали, потому что это не входило в спецификацию. Это изменилось в версии 4.0, поэтому версия MSBuild 4.0 не будет выдавать ошибок при использовании дополнительных параметров, в то время как предыдущие версии, такие как 3.5, будут. После компиляции у CLR нет проблем с необязательными параметрами, поскольку она всегда их поддерживала, а не сам компилятор. - person Goronmon; 30.11.2010