.NET Запуск от имени администратора

WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
bool isRunAsAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

// Если нет прав админа 
if (!isRunAsAdmin)
{
	ProcessStartInfo proc = new ProcessStartInfo();
	proc.UseShellExecute = true;
	proc.WorkingDirectory = Environment.CurrentDirectory;
	proc.FileName = System.Windows.Forms.Application.ExecutablePath;
	proc.Verb = "runas";
	proc.Arguments = string.Empty;

	try
	{
		Process.Start(proc);
	}
	catch
	{

	}

	Application.Current.Shutdown();  // Выходим
}

.NET завершить процесс

 
var ps1 = System.Diagnostics.Process.GetProcessesByName("Process Name").ToList();
if (ps1.Count > 1)
{
	foreach (Process p1 in ps1)
	{
		if (p1.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
		{
			p1.Kill();
		}
	}
}

Ошибка при компиляции типа The "EnsureBindingRedirects" task failed unexpectedly.

Ошибка:
Error 1 The "EnsureBindingRedirects" task failed unexpectedly.
System.NullReferenceException: Object reference not set to an instance of an object.
   at Roxel.BuildTasks.EnsureBindingRedirects.MergeBindingRedirectsFromElements(IEnumerable`1 dependentAssemblies)
   at Roxel.BuildTasks.EnsureBindingRedirects.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__20.MoveNext() 

Лечиться просто, нужно в web.config в  <dependentAssembly>  добавить атрибут culture="neutral" к сборкам


Чтобы получилось вот так:

<dependentAssembly>
	<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"  culture="neutral"/>
	<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>

WPF xaml разметка из кода на C#

Разметка Grid из кода
Установка фиксированного размера:

TableGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new System.Windows.GridLength(50) });
TableGrid.RowDefinitions.Add(new RowDefinition() { Height = new System.Windows.GridLength(50) });

Установа отностиельного размера, типа вездочка  (*) или Auto:

LayoutRoot.ColumnDefinitions[1] = new ColumnDefinition() { Width = new System.Windows.GridLength(2, System.Windows.GridUnitType.Star) };
LayoutRoot.RowDefinitions[1] = new  RowDefinition() { Height = new System.Windows.GridLength(2, System.Windows.GridUnitType.Auto) };

Помещение элемента в сетку:

TextBox  txtbox = new TextBox();
Grid.SetRow(txtbox, 2); 
Grid.SetColumn(txtbox, 3);
Grid.SetColumnSpan(txtbox, 2);
Grid.SetRowSpan(txtbox, 3);
TableGrid.Children.Add(txtbox); // добавляем элемент в грид

MVVM Command – еще один способ

 

public class TestViewModel : BaseViewModel
{
public ICommand MyCommand { get; set; }
public TestViewModel ()
{
this.MyCommand = new DelegateCommand(this.MyCommandExecuted, this.CanMyCommandCanExecuted);        
}
public void MyCommandExecuted(object param)
{
// что-то делаем
}
private bool CanMyCommandCanExecuted(object param)
{
return param != null;
}
}


или собранное в кучу на делегатах:

public ICommand MyCommand
        {
            get
            {
                return new DelegateCommand((executedParam) =>
                {
                    //executed code
                }, 
                (canExecutedParam) =>
                {
                    //CanCxecuted code
                    return true;
                }); 
            }
        }

ILMerge

ILMerge это утилита для объединения нескольких .NET сборок в одну.

 

http://www.microsoft.com/en-us/download/details.aspx?id=17630

 

пример

ilmerge /target:winexe /out:MergedApplicationExecutable.exe ApplicationExecutable.exe TelerikCommon.dll Telerik.WinControls.UI.dll Telerik.WinControls.dll

 

пример для .net 4.0

ILMerge.exe /target:winexe /targetplatform:"v4, C:\Windows\Microsoft.NET\Framework\v4.0.30319"/out:MergedApplicationExecutable.exe AppliocationExecutable.exe Telerik.WinControls.dll Telerik.WinControls.UI.dll TelerikCommon.dll

Task (async await) и Parallel в C#

Как работать с Task

var t = Task.Factory.StartNew(() => DoAction());

 

Action<object> action = (object obj) =>
{
Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, obj.ToString(), Thread.CurrentThread.ManagedThreadId);
};
// Создать задачу, без ее немедленного запуска
Task t1 = new Task(action, "alpha");
// Cоздать задачу и сразу запустить ее
Task t2 = Task.Factory.StartNew(action, "beta");
// дождаться завершения t2
t2.Wait();
// Запустить задачу t1 
t1.Start();
Console.WriteLine("t1 has been launched. (Main Thread={0})", Thread.CurrentThread.ManagedThreadId);
// Ждем задачу до конца.
// Вы можете дополнительно обеспечить тайм-аута или отмены маркера
// Для смягчения ситуации, когда задача занимает слишком много времени, чтобы закончить.        
t1.Wait();
// Создать задачу но не запустить ее
Task t3 = new Task(action, "gamma");
// Запустите его синхронно
t3.RunSynchronously();
// Хотя задача была выполнена синхронно, это хорошая практика, чтобы ждать его, завершения.
t3.Wait();

 

// вернуть задачу 
public Task<int> DoSome()
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(500);
return 100500;
});
}

 


Параллелизм

Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());


Ссылки:

http://msdn.microsoft.com/ru-ru/library/system.threading.tasks.task.aspx

http://msdn.microsoft.com/ru-ru/library/dd537609.aspx

Makecert

Эта утилита нужна для создания сертификатов, например их можно использовать как тестовые для проверки работы SSL. Нужно запустить Developer Command Prompt (идет в комплекте с Visual Studio).


Пример:


Makecert –r –pe –n CN="www.example.com" –b 05/10/2010 –e 12/22/2011 –eku 1.3.6.1.5.5.7.3.1 –ss my –sr localmachine -sky exchange –sp "Microsoft RSA SChannel Cryptographic Provider" –sy 12 MyCertForExampleCom.cer

Эта команда создает само заверяющий сертификат, который может использоваться для тестирования веб-приложения, которое использует протокол SSL (Secure Sockets Layer) на веб-сервере, URL-адрес которого является www.example.com. OID, определяемый параметром –eku, идентифицирует этот сертификат как сертификат сервера SSL. Сертификат хранится в хранилище my и доступен на уровне компьютера (а не пользователя). Закрытый ключ сертификата можно экспортировать, сертификат действителен с 01.01.2013 до 01.01.2015 года и называется MyCertForExampleCom.cer.

Создаем сертификат

makecert -r -pe -n "CN=My Root Authority" -ss CA -sr CurrentUser   -a sha1 -sky signature -cy authority -sv CA.pvk CA.cer


Создаем серверный сертификат с экспортируемый закрытый ключ

makecert -pe -n "CN=my.server" -a sha1 -sky Exchange -eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv server.pvk server.cer
pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx

pvk2pfx по умолчанию не задает пароль к  PFX выходе.  Вы должны использовать -po параметр для указания пароля.

Затем вы можете использовать. PFX файл на сервере приложения (или установить его в IIS
Для того чтобы клиенты могли доверять вашему сертификату нужно на них установить сертификат CA.cer (немного выше)

certutil -user -addstore Root CA.cer

чтобы програмно установить сертификат в IIS нужно сделать следующее:

// Предположим, “Site”  уже установлен на вашем сайте через что-то вроде
// Site site = mgr.Sites.Add(siteName, directory, 443);
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
// \bin\certificate.pfx, где находиться файл сертификата.
// 1234 является паролем к CertFile (экспортируемых из IIS)
X509Certificate2 certificate = new X509Certificate2(directory + @"\bin\certificate.pfx", "1234");
store.Add(certificate);
var binding = site.Bindings.Add("*:443:", certificate.GetCertHash(), store.Name);
binding.Protocol = "https";
store.Close();


Скачать MakeCert: http://download.microsoft.com/download/platformsdk/update/5.131.3617.0/nt45xp/en-us/makecert.exe
Ссылки:
http://msdn.microsoft.com/ru-ru/library/bfsktky3.aspx
http://stackoverflow.com/questions/496658/using-makecert-for-development-ssl
http://stackoverflow.com/questions/4498291/programatically-import-cert-into-iis
http://stackoverflow.com/questions/3770233/is-it-possible-to-programmatically-generate-an-x509-certificate-using-only-c

SignalR добавить header для Forms авторизации

Если у вас на сервере настроение Froms авторизация, а вы из клиента пытаетесь подключиться к сервису то обычно нужно добавить в заголовок запроса авторотационные Cookies.
Как это сделать
1. На сервере в Hub добавить авторизацию:

[Authorize]
[HubName("MyTestHub")]
public class TestHub : Hub
{
public TestHub()
{
int a = 5;
}
}

2. Каким-то образом получить заголовок авторизации
http://acroblog.acrovations.com/post/2013/03/22/Forms-авторизация-WCF-Data-Service.aspx
например как тут, в функции GetCookie

var hub = new HubConnection("http://localhost:5555/signalr");
hub.CookieContainer = new CookieContainer();
hub.CookieContainer.SetCookies(new Uri("http://localhost:5555/"), MyCookieHeader.Cookie);
var x = hub.CookieContainer.GetCookieHeader(new Uri("http://localhost:5555/"));
var cook = new Cookie("test", "test");
cook.Domain = "localhost";
cook.Path = "/";
hub.CookieContainer.Add(cook);
proxy = hub.CreateHubProxy("MyTestHub");
hub.Start().Wait();

все.
Главное добавить какой-то cookie чтобы было с чем заголовок отправлять.

MVVM Command Pattern

public ICommand CommandName { get; set; }
private void CommandExecutedLogic(object param)
{
// Do Some
}
private bool CanExecutedLogic(object param)
{
return param != null;
}


В конструкторе:

this.CommandName = new DelegateCommand(this.
CommandExecutedLogic, this. CanExecutedLogic);

WCF Data Services и Composite Key и Telerik Open Access ORM (OData V3)

Если вы используете связи многие-ко-многим (many-to-many) с помощю составных ключей:

CREATE TABLE ClientInGroup
(
ClientID bigint foreign key references Client(ID) not null, 
ClientGroupID bigint foreign key references ClientGroup(ID) not null, 
PRIMARY KEY  
(
ClientID,
ClientGroupID 
)
)

И решили использовать WCF Data Service то можете столкнуться с проблемой когда вы не можете обновить связанные записи.
Для решение этой досадной проблемы нужно сделать вот чего:

На сервер в сгенерированном телериком файле OpenAccessUpdateProvider найти функцию GetNavigationalMember и добавить туда строку navigationProperty.IsManaged = true;

private MetaNavigationMember GetNavigationalMember(string propertyName, string className)
{
MetaNavigationMember navigationProperty = this.GetMember(propertyName, className) as MetaNavigationMember;
navigationProperty.IsManaged = true;
if (navigationProperty.Association is MetaJoinTableAssociation && !navigationProperty.IsManaged)
{
string exceptionMessage = string.Format("Change made on property {0} of type {1} that has IsManaged set to False will not be persisted.",
navigationProperty.PropertyName, navigationProperty.DeclaringType.FullName);
throw new InvalidOperationException(exceptionMessage);
}
return navigationProperty;
}

После этого все будет работать. И в вашем приложении вы можете спокойно связывать данные

dataModel.AddLink(CurrentSportSection, "Venues", item);


или

dataModel.DeleteLink(CurrentSportSection, "Venues", item);

 

WPF Data Service V2 в место V3

В процессе генерации прокси класа для WCF Data Service Visual Studio бывает указывает версию V2 в место V3.
Чтоб это исправить нужно найти класс сервиса и немного поменять конструктор:

[System.CodeDom.Compiler.GeneratedCodeAttribute ("System.Data.Services.Design", "1.0.0")]
public MyDataBaseService (global :: System.Uri serviceRoot):
base (serviceRoot, System.Data.Services.Common.DataServiceProtocolVersion.V3)
{
this.ResolveName = new global :: System.Func <global::System.Type, string> (this.ResolveNameFromType);
this.ResolveType = new global :: System.Func <string, global::System.Type> (this.ResolveTypeFromName);
this.OnContextCreated ();
}

В базовый конструктор нужно добавить System.Data.Services.Common.DataServiceProtocolVersion.V3 – что укажет что мы используем протокол версии V3.

Хотя после последнего обновления, данные манипуляции ненужны.

Forms авторизация WCF Data Service

Для того чтобы поддерживать авторизацию для доступа к WCF Data Service  с помощю Forms вам нужно собственно настроить эту авторизацию на сервере.

<system.web>
<authentic.ation mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" requireSSL="false" />
</authentication>
</system.web>

Убедиться что все верно работает.
Далее нужно включить сервис авторизации. Это делетьс в web.config

<system.web.extensions>
<scripting>
<webServices>
<authenticationService enabled="true" requireSSL="false" />
</webServices>
</scripting>
</system.web.extensions>

Далее в клиенте нужно написать расширение для класса сервиса:

using System;
using System.Data.Services.Client;
using System.IO;
using System.Linq;
using System.Net;
using System.Security;
using My.Helper;
namespace My.MySportDataBaseService
{
public partial class MySportDataBase
{
partial void OnContextCreated()
{
this.SendingRequest +=
new EventHandler<SendingRequestEventArgs>(OnSendingRequestManualCookies);
}
void OnSendingRequestManualCookies(object sender, SendingRequestEventArgs e)
{
try
{
NetworkCredential creds = this.Credentials as NetworkCredential;
string cookie = this.GetCookie(creds.UserName, creds.Password);
e.RequestHeaders.Add("Cookie", cookie);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
private string GetCookie(string userName, string password)
{
if (MyParameters.Cookie == null)
{
string loginUri = string.Format("{0}/{1}/{2}",
string.Format("http://{0}", MyParameters.ServerName),
"Authentication_JSON_AppService.axd",
"Login");
WebRequest request = HttpWebRequest.Create(loginUri);
request.Method = "POST";
request.ContentType = "application/json";
string authBody = String.Format(
"{{ \"userName\": \"{0}\", \"password\": \"{1}\", \"createPersistentCookie\":false}}",
userName,
password);
request.ContentLength = authBody.Length;
StreamWriter w = new StreamWriter(request.GetRequestStream());
w.Write(authBody);
w.Close();
WebResponse res = request.GetResponse();
if (res.Headers["Set-Cookie"] != null)
{
MyParameters.Cookie = res.Headers["Set-Cookie"];
}
else
{
throw new SecurityException("Invalid username and password");
}
}
return MyParameters.Cookie; 
}
}
}

Главное хранить где-то cookies авторизации чтобы постоянно не тратить время повторно на авторизацию

Ну и использовать указывая логин и пароль в NetworkCredential:

this.dataModel = new MySportDataBaseService.MySportDataBaseService(MyParameters.ConnectionString);
this.dataModel.Credentials = new System.Net.NetworkCredential(MyParameters.Login, MyParameters.Password);

 

http://blogs.msdn.com/b/astoriateam/archive/2010/07/21/odata-and-authentication-part-7-forms-authentication.aspx

как поменять Authentication_JSON_AppService.axd  - http://msdn.microsoft.com/....