AccessViolationException 예외는 네이티브 쪽에서 메모리 접근 위반을 했을 때 발생 하는 예외 이다.

할당되지 않은 메모리 또는 코드가 접근 권을 갖지 않는 메모리를 읽거나 쓰기를 시도하면 네이티브 코드(언 세이프 코드)에서 액세스 위반이 발생한다.

 

그러나 보통 System.Exception의 파생 클래스인 셈이라서 catch에서 이 예외를 포착할 것으로 생각하지만 애플리케이션은 이 예외를 잡지 못해서 이상 종료를 한다.

 

.NET Framework 3.5 이전에는 AccessViolationException catch 할 수 있었지만 .NET Framework 4 이후에서는 못하도록 바뀌었다.

 

이 예외를 잡고 싶다면 두 가지 방법을 하나를 하면 된다.

1. HandleProcessCorruptedStateExceptionsAttribute

AccessViolationException catch 하고 싶은 메소드에HandleProcessCorruptedStateExceptionsAttribute를 붙여서 잡을 수 있다.

[HandleProcessCorruptedStateExceptions]

void DoSomething()

{

try {

AccessViolationException를 발생하는();

} catch(AccessViolationException e) {

//---포착 가능

}

}

 

 

2.legacyCorruptedStateExceptionsPolicy

하위 호환성 때문에 기존(.NET Framework 3.5 이전)처럼 애플리케이션 전체에서 포착할 수 있도록 하고 싶은 경우. 구성 파일(*. config)<legacyCorruptedStateExceptionsPolicy>요소를 넣어서 해결할 수 있다.

<configuration>

<runtime>

<legacyCorruptedStateExceptionsPolicy enabled="true"/>

</runtime>

</configuration>

 

 

출처: http://blog.xin9le.net/entry/2015/07/22/053738

 

 

저작자 표시
신고
by 흥배 2016.01.22 08:00

릴리즈 버전을 기준으로 할 때 unsafe가 제일 빠르다.

 

디버그 버전

 

 BitConverter

 50 ms

 Marshal

 802 ms

 unsafe

 140 ms

 

 

릴리즈 버전

 

 BitConverter

 49 ms

 Marshal

 631 ms

 unsafe

 32 ms

 

 

테스트 코드

class Program
{
 const int COUNT = 1000000;
 static void Main(string[] args)
 {
  var basearray = Enumerable.Range(0, 1024).Select(x => (byte)x).ToArray();

  var sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = BitConverter.ToInt64(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"BitConverter {sw.ElapsedMilliseconds}ms");

  sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = BtoS<Int64>(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"Marshal {sw.ElapsedMilliseconds}ms");

  sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = ToInt64(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"unsafe {sw.ElapsedMilliseconds}ms");

 

  Console.ReadKey();
 }

 private static T BtoS<T>(byte[] bytes, int startIndex) where T : struct
 {
  GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
  T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject() + startIndex,
   typeof(T));
  handle.Free();
  return stuff;
 }

 unsafe static void PutBytes(byte* dst, byte[] src, int start_index, int count)
 {
  for (int i = 0; i < count; i++)
   dst[i] = src[i + start_index];
 }

 unsafe static Int64 ToInt64(byte[] bytes, int startIndex)
 {
  Int64 ret;

  PutBytes((byte*)&ret, bytes, startIndex, 8);

  return ret;
 }

}

 

 

출처: http://qiita.com/yu_ka1984/items/fa403894af35a3f3925c

 

 

저작자 표시
신고
by 흥배 2016.01.20 09:00

1. 공개 URL 지정

셀프 호스팅에 관한 기사를 보면 대부분 http://localhost:8080 와 같은 localhost 전용의 URL이 지정 되어 있다. 루프 백을 나타내는 설정으로 이 상태로는 외부에서 접근할 수 없다.

자신에게 부여된 IP 주소로 서비스를 공개하고 싶다면 다음과 같이 한다.

[STAThread]

static void Main()

{

using(WebApp.Start("http://+:8080")

{

//---생략

}

}

 

localhost 설정을 + 으로 바꾸는 것이 포인트.

 

 

 

2. 관리자 권한으로 실행

실행하면 TargetInvocationException 예외가 발생한다.

이를 피하기 위해서는 애플리케이션을 관리자 권한으로 실행해야 한다.

app.manifest 에 아래의 설정을 넣는다

 

<?xml version="1.0" encoding="utf-8"?>

<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">       

<security>           

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">               

<!—실행 시에 관리자 권한을 요구 -->               

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />            </requestedPrivileges>       

</security>   

</trustInfo>

</assembly>

 

Visual Studio에서 디버깅 할 때는 Visual Studio 자체도 관리자 권한으로 승격시켜야 한다.(앞의 매니페스토 설정을 넣으면 디버깅 실행 시 관리자 권한 승격을 요구한다)

 

 

3. 통신 포트 해방

마지막으로 방화벽 수신/송신 규칙에 통신용 포트를 해방하는 설정을 넣는다.

 

 

 

출처: http://blog.xin9le.net/entry/2015/08/17/150406

 

저작자 표시
신고
by 흥배 2016.01.18 08:00
.net, C#

C#로 배열을 확보한 뒤 dl것을 IEnumerable IReadOnlyList로 받아서 처리할 경우 어느 정도의 속도 차이가 있는지를 측정.

.NET 4.6, x64 환경에서 조사.

 

100000000 요소에서 결과는

Array        87 ms.

IEnumerable  624 ms.

IReadOnlyList 568 ms.

 

속도가 중요한 경우는 IEnumerable 등으로 받아서 내부에서 배열로 캐스트 해서 처리하는 특별 루틴을 넣는 것을 생각해도 좋을듯.

 

 

아래는 테스트 코드:

 

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

 

namespace ColTest

{

  class CollectionSpeedTest

  {

    public static void Main(string[] args)

    {

      var count = int.Parse(args[0]);

      var arr = random().Take(count).ToArray();

      using (new StopwatchHelper("Array"))

        TestArray(arr);

      using (new StopwatchHelper("IEnumerable"))

        TestIEnumerable(arr);

      using (new StopwatchHelper("IReadOnlyList"))

        TestIReadOnlyList(arr);

    }

 

    static double TestArray(double[] arr)

    {

      double sum = 0;

      for (int i = 0; i < arr.Length; i++)

        sum += arr[i];

      return sum;

    }

 

    static double TestIEnumerable(IEnumerable<double> en)

    {

      double sum = 0;

      foreach (var v in en)

        sum += v;

      return sum;

    }

 

    static double TestIReadOnlyList(IReadOnlyList<double> col)

    {

      double sum = 0;

      for (int i = 0; i < col.Count; i++)

        sum += col[i];

      return sum;

    }

 

    static IEnumerable<double> random()

    {

      var random = new Random();

      for (;;)

      {

        yield return random.NextDouble();

      }

    }

 

    class StopwatchHelper : IDisposable

    {

      public StopwatchHelper(string format, params string[] args)

      {

        Console.WriteLine(format, args);

        sw.Start();

      }

 

      public void Dispose()

      {

        sw.Stop();

        Console.WriteLine("{0} ms.", sw.ElapsedMilliseconds);

      }

 

      Stopwatch sw = new Stopwatch();

    }

  }

}

 

 

출처: http://espresso3389.hatenablog.com/entry/2015/11/09/212923

저작자 표시
신고
by 흥배 2015.12.14 08:00

강연에서 사용한 Demo 프로젝트

https://github.com/jacking75/kgc2015Demo_ServerMornitoringSystem


강연 문서





저작자 표시
신고
by 흥배 2015.12.02 08:00

C++에서 정의한 아래 구조체를
struct example {
    int a;
    bool b;
    bool c;
    int d;
    int e;
}:


(Windows 환경에서)C#에서 아래와 같이 마셜링 하면 버그가 발생한다

[StructLayout(LayoutKind.Sequential)]
struct ExampleCS
{
    public int a;
    public bool b;
    public bool c;
    public int d;
    public int e;
}



버그는 C++에서 넘긴 것과 C#에서 받은 값이 서로 다르다.
이유는 C#에서는 bool이 1byte 이지만, C++로 마셜링하면 BOOL(4byte)로 인식하기 때문이다.

(Windows SDK에서 bool 이라는 타입은 없고 대신 BOOL을 사용하고 있다)


그래서 아래와 같이 바꾸어야 한다.


[StructLayout(LayoutKind.Sequential)]
struct ExampleCS
{
    public int a;
    [MarshalAs(UnmanagedType.I1)]
    public bool b;
    [MarshalAs(UnmanagedType.I1)]
    public bool c;
    public int d;
    public int e;
}




참고: http://qiita.com/_pochi/items/9dc460ee62f7da2d216c

저작자 표시
신고
by 흥배 2015.11.02 08:00

◎ : OS 에 처음부터 포함 되어 있다

● : 다운로드 해서 설치 가능 ※ ( ) 은 시스템 요건 상 필요로 하는 OS 서비스 팩



출처: http://blogs.msdn.com/b/visualstudio_jpn/archive/2015/10/19/dotnet-framework-support-lifecycle-policy-summary-2015oct.aspx

저작자 표시
신고
by 흥배 2015.10.23 08:00
.net, C#

1. *.cscfg

WebRole, WorkerRole 프로젝트를 만들면 생긴다.

Azure WebSites가 있으므로 앞으로는 잘 안 쓰일 것 같다.

 

 

환경마다 설정

환경마다(Production, Staging ) 설정이 가능하다.

ex) ServiceConfiguration.Production.cscfg

 

 

반영 방법

패키지 재 작성이 불필요. Azure 관리 포털에서 직접 변경할 수 있다.

 

 

 

2. app.config / web.config <appSettings>

환경마다 설정

환경마다(Production, Staging ) 설정이 가능하다.

ex) web.Debug.config

 

 

반영 방법

패키지의 재 작성이 필요.

 

 

 

3. app.config / web.config <applicationSettings>

데이터 유형 지정을 할 수 있다.

 

환경마다 설정

불가능. app.Debug.config 처럼 만들어도 읽는 것은 app.config(Settings.settings)에 기술되어 있는 값

 

 

반영 방법

패키지의 재 작성이 필요.

 

 

 

4. Settings.settings

프로젝트를 오른쪽 클릭하고 "속성"->"설정"에서 표시된다.

 

이것은

• 범위를 애플리케이션으로 하면 app.config/web.config <applicationSettings>에 기술한다

• 범위를 사용자로 하면 app.config/web.config <userSettings>에 기술한다

 

참고로 사용자 범위 파라미터는 프로그램에서 변경 보존이 가능.

 

 

 

설정 파일 읽기

CloudConfigurationManager.GetSetting(name)

이것은 처음 *.cscfg을 찾아보고 없으면 app.config/web.config <appSettings>를 본다

 

 

(Web)ConfigurationManager.AppSettings[name];

app.config/web.config <appSettings>를 본다

 

 

Properties.Settings.Default.<name>

app.config/web.config <applicationSettings>를 본다

 



출처: http://qiita.com/ko2ic/items/6dd2a57759829a3620f0

 

 

저작자 표시
신고
by 흥배 2015.09.07 08:00

원문: Announcing . NET Framework 4.6-. NET Blog

http://blogs.msdn.com/b/dotnet/archive/2015/07/20/announcing-net-framework-4-6.aspx

 

 

WPF

투명한 자식 창.

DPI 대응 개선(보더 있는 컨트롤의 레이아웃에 관해 둥글게 처리, DPI가 다른 멀티 모니터 대응 개선, 여러 해상도의 커서 화상 등).

 

 

Windows Forms

DPI 대응 개선(콤보 박스와 데이터 그리드 뷰 등의 컨트롤이 고 DPI 대응).

 

 

RyuJIT

버그 픽스 등.

 

 

SIMD

System.Numerics 이름 공간의 벡터형, 행렬형, 쿼터니온(Nuget에서 입수)

 

 

GC

핀 박은 오브젝트를 포함 컴팩션 최적화.

Gen1에서 Gen2 승격 처리 최적화.

"No GC" 구간.

 

 

WCF

TLS 1.1/1.2 대응.

HTTP 접속 분리(커넥션 그룹과 채널 팩토리)

 

 

WF

Out Of Order 실행.

 

 

ADO.NET

SQL Server 2016 Always Encrypted(드라이버 레벨에서 항상 암호/복호화 하는 기능) 대응.

 

 

Async

System.Threading.AsyncLocal 클래스(비동기 컨텍스트 마다의 로컬 스토리지).

Task가 스레드의 컬처나 UI 컬처를 이어받음.

Task 클래스에 편리한 메소드를 추가.

네임 파이프도 비 동기 통신을 서포트.

 

 

네트워크

Windows 10에서 구현된 로컬 포트와 TCP 접속을 재이용하는 기구 지원.

System.Uri에서 국제화 도메인 이름/PunyCode 지원

 

 

기타

CLR 어셈블리 로더 성능 개선.

암호 알고리즘의 업데이트, 추가 등.

DateTimeOffset UnixTime와의 상호 변환.

EventSource의 혼잡.

AppContext 사용자 라이브러리의 호환 동작 스위치를 제공하는 API.

IReadOnlyCollection을 구현하는 컬렉션 증가.

System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture를 설정 가능하도록

 

 

출처: https://gist.github.com/matarillo/00db5b697d13b5a0c230

 

저작자 표시
신고
by 흥배 2015.08.12 08:00

최신 닷넷플랫폼과 Visual Studio 2015에 대해서 간략하게 잘 설명한 글이 있어서 번역해 보았습니다^^




























저작자 표시
신고
by 흥배 2015.08.03 08:00
| 1 2 3 4 5 ··· 8 |