Я заметил, что вы используете «рабочий процесс» в вашем примере параметра [ref]. Для простоты давайте назовем это «функцией» и вернемся к «рабочему процессу» позже.
В коде необходимо изменить три вещи:
()
. Вот код, который работает:
function Test
{
Param([Parameter(Mandatory=$true)][ref]$someString)
write-verbose $someString.value -Verbose
$someString.value = "this is the new string"
}
cls
$someString = "hi"
Test -someString ([ref]$someString)
write-host $someString
Что касается «рабочих процессов». Они очень ограничены, прочитайте Рабочие процессы PowerShell: ограничения . В частности, вы не можете вызвать метод для объекта в рабочем процессе. Это сломает черту:
$someString.value = "this is the new string"
Я не думаю, что использование параметров [ref] в рабочем процессе практично из-за ограничений рабочего процесса.
Хорошо, следуя решению, которое они тут придумали: http://forums.asp.net /p/997608/2209437.aspx
Я создал класс, который в конструкторе без параметров (который вам нужен) просто получает сервер и порт из аргументов командной строки. Таким образом, я могу пойти "MembershipInitializer.exe" SomeSqlServer \ Instance "51000.
public class CustomSQLMembershipProvider : SqlMembershipProvider {
private readonly string _server;
private readonly string _port;
/// <summary>
/// Initializes a new instance of the <see cref="T:System.Web.Security.SqlMembershipProvider"/> class.
/// </summary>
public CustomSQLMembershipProvider() {
string[] args = System.Environment.GetCommandLineArgs();
// args[0] is the exe name
_server = args[1];
_port = args[2];
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
base.Initialize(name, config);
// Update the private connection string field in the base class.
string connectionString = string.Format(@"Data Source={0},{1};Initial Catalog=aspnetdb;UID=NICCAMembership;PWD=_Password1;Application Name=NICCA;Connect Timeout=120;", _server, _port);
// Set private property of Membership provider.
FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
connectionStringField.SetValue(this, connectionString);
}
}
В app.config вашего консольного приложения (или приложения Windows)
<configuration>
<connectionStrings>
<clear/>
<add name="MembershipDB"
connectionString="Some Bogus String here that gets overrided in the custom class"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<authentication mode="Forms"/>
<authorization>
<deny users="?"/>
</authorization>
<membership>
<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider"
connectionStringName="MembershipDB"
applicationName="NICCA"
type="MyInitializeMembershipDB.CustomSQLMembershipProvider, MyInitializeMembershipDB"
requiresUniqueEmail="false"
requiresQuestionAndAnswer="false"/>
</providers>
</membership>
</system.web>
</configuration>
Если вам также нужен бит поставщика ролей, вы вероятно, придется переопределить SqlRoleProvider примерно таким же образом.
Если вы создаете программу для автоматической инициализации базы данных членства в определенном состоянии на основе, но адрес сервера sql и имя порта неизвестны, пока кто-то не введет их в установку волшебник, это поможет ..
Membership.ApplicationName = "yourfbaApplicationame";
Пользователь MembershipUser = Membership.CreateUser ("admin," пароль "," emaiol@g.com ");
и Убедитесь, что у вас есть следующие записи в файле конфигурации.
<connectionStrings>
<add connectionString="server=sqd01-1-cll;database=FBA;Integrated Security=SSPI;" name="FBASqlConnString" providerName="System.Data.SqlClient"/>
Если вы все еще хотите использовать полный код и не нужно использовать файл конфигурации. Используйте приведенный ниже
SqlMembershipProvider ObjSqlMembershipProvider = new SqlMembershipProvider();
SqlRoleProvider ObjSqlRoleProvider = new SqlRoleProvider();
NameValueCollection ObjNameValueCollRole = new NameValueCollection();
NameValueCollection ObjNameValueCollMembership = new NameValueCollection();
MembershipCreateStatus enMembershipCreateStatus;
ObjNameValueCollMembership.Add("connectionStringName", "Connection String Name");
ObjNameValueCollMembership.Add("applicationName", "ApplicatioNAme");
//these items are assumed to be Default and dont care..Should be given a look later stage.
ObjNameValueCollMembership.Add("enablePasswordRetrieval", "false");
ObjNameValueCollMembership.Add("enablePasswordReset", "false");
ObjNameValueCollMembership.Add("requiresQuestionAndAnswer", "false");
ObjNameValueCollMembership.Add("requiresUniqueEmail", "false");
ObjNameValueCollMembership.Add("passwordFormat", "Hashed");
ObjNameValueCollMembership.Add("maxInvalidPasswordAttempts", "5");
ObjNameValueCollMembership.Add("minRequiredPasswordLength", "1");
ObjNameValueCollMembership.Add("minRequiredNonalphanumericCharacters", "0");
ObjNameValueCollMembership.Add("passwordAttemptWindow", "10");
ObjNameValueCollMembership.Add("passwordStrengthRegularExpression", "");
//hard coded the Provider Name,This function just need one that is present. I tried other names and it throws error. I found this using Reflector ..all the rest are take care by the above
//name value pairs
ObjSqlMembershipProvider.Initialize("AspNetSqlMembershipProvider", ObjNameValueCollMembership);MembershipUser user = ObjSqlMembershipProvider.CreateUser("admin,"password","emaiol@g.com");
Один из них. Вам не нужно указывать строку подключения в файле конфигурации, больше ничего не нужно. Если вы хотите, чтобы это тоже было из кода, вам необходимо унаследовать класс