.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/....

Unable to activate windows store app

Иногда может возникнуть проблема при заупске приложение Windows Store App типа "Unable to activate windows store app"

Для того чтобы починить нужно удалить содержимое папки bin и перекомпилировать приложение