모꼬지라는 웹 사이트를 서비스 하고 있어요~


클래스 및 모임 을 중계해 주는 사이트인데


이미지 관련된 부분이 많아서 Thumbnail을 만들어보려고 하는 도중에


비트윈이라는 프로그램에서 Skia를 쓰고 나서 속도가 빨라졌다는 얘기를 듣고 도전해보기로 했어요


제가 닷넷 유저라  닷넷으로된 소스가 없나 찾아보았더니 


GitHub에 모노(Mono) 프로젝트로 SkiaSharp 이 있더라구요 너무 다행이었어요.


C++로 된 LIB를 가져와서 DLL로 변환 후에 Dllmport 하지 않아도 되는 귀찮음이 없어져서요^^


물론 Visual Studio 켜서~ Nuget Pagkage 쪽에서 SkiaSharp으로 받아도 된답니다.~


SkiaLibrary 설명으로는 제가 본것은 Xamarin 쪽에 올라온 것과 구글쪽에 라이브러리 설명이 있어요


라이브러리 설명 :  구글 , Xamarin


모르는 라이브러리 있으면 찾아보면 됩니다.


지금 버전은 Version 1.54.0에요


GitHub으로 다운을 받았다면 아래와 같은 폴더 구성으로 되어있어요



자자 다른건 볼 필요없이 samples 폴더-> Skia.WPF.Demo 폴더로 들어가서 Solution 프로젝트(Skia.WPF.Demo.sln)를 열어봅시다.


켜보면 분명 에러 나올겁니다. 



안나오시는 분들있으면 그대로 진행해주세요^^.

오류 내용은 1.54.0.1 버전으로 받아야져있는데 Nuget에는 1.54.0 버전만 있어서 찾을 수 없다. 이런 내용입니다. Nuget 패키지 복원하셔도 1.54.0.1이 없어서 못 받으실거에요.

해결 방법은 기존의 1.54.0.1 을 지우고 1.54.0 버전을 받으면 됩니다.


먼저 packages.config 파일로 가서 version="1.54.0.1" 로 되어있는 것을 version="1.54.0" 인 현재 버전으로 바꾸어주세요. 그러면 오류가 하나 없으질 것이고,


다시 폴더로와서 Skia.WPF.Demo.csproj 이 파일을 편집으로 열어봅시다.



<Import Project="packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets" Condition="Exists('packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets')" />


<Error Condition="!Exists('packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets'))" />


위에 두 부분을 현재 버전으로 바꿔주자


<Import Project="packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets" Condition="Exists('packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets')" />


<Error Condition="!Exists('packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets'))" />


이렇게 하면 에러는 사라진다~


이후로는 SK...CLASS이름 들의 에러가 나오는데 Nuget Package에서 SkiaSharp을 제거 후에 다시 설치하자.



이 라이브러리가 설치가 되면  빌드(Build)를 한다. 그리고 이제는 


프로젝트에 간단한 에러사항들을 처리해준다.


나의 경우는 아래의 함수가 없는데 호출할려고해서 주석으로 처리했다.

//path.GetTightBounds (out rect);


그리고 이제 빌드를 하면 

오류 The Platform needs to be either x64 or x86 to support Skia in Windows. Skia.WPF.Demo

위의 오류 메세지가 나오는데 



Platform 을 바꿔서 실행하자!x64나 x86 둘중 하나 고르면 되요



자 실행 되었다.

간단히 콤보박스를 넘겨보면서 샘플을 보자

여기까지 오셨으면 다음 시간 2탄에는 SkiaSharp을 이용해서 이미지를 Resize하는 방법을 알려주겠어요~

수고하셨습니다. 


댓글은 작성자에 대한 고마움의 표시입니다.^^

'.NET 개발 > C#' 카테고리의 다른 글

Webp C#  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,

Webp C#

.NET 개발/C# 2016. 9. 23. 09:33

구글 라이브러리 Webp 를 닷넷에서 쓰려면 


C++ 라이브러리를 C#으로 사용 할 수 있게 dllImport 시켜줘야 해요


아직 이 부분은 안해보았습니다.


검색을 더 해보니 webp-discuss 그룹


이 그룹 페이지에 중요한 링크를 얻었어요


하나는 WEBP-NET GitHub 페이지 입니다. 여기서 32bit , 64bit DLL을 얻을 수 있습니다.


이렇게 DLL이 나눠져있다는건 플랫폼에 따라 불러와야하는 DLL이 다르다는거 아실거라 믿습니다~


물론 샘플 파일도 있습니다.


그리고..다른 WEBP 그룹 에 보면 


테스트 샘플 자료도 있습니다.


webptest_compild.zip


WebPTest_sources_and_dll.zip


샘플 파일도 있어서 확인해보면 됩니다.!



'.NET 개발 > C#' 카테고리의 다른 글

C# Skia Sharp 사용해보기 (예제편) 1탄  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,



C# 1.0 

VM언어이지만 Interop을 고려 

PInvoke, unsafe(pointer), delegate


c# 2.0 제네릭

c# 2.0 ?? 연산자

c# 2.0 yield return/break

c# 2.0 partial class 

- 클래스의 구현을 2개 이상으로 분리

- 자동 코드 생성의 문제점 해결!


c# 2.0 anonyumous method

- 이름 없는 메서드 정의 가능

- delegate 타입의 인자로 인라인 메서드 정의 

- 이벤트 처리기


c# 2.0  static class

- IL 코드 표현 : 상속 불가능한 추상 클래스

- C# 컴파일러 : 인스턴스 멤버 정의 불가능


1. C++의 Template과 유사

2.메서드 수준의 제네릭 지원

3. 박싱/언박싱 문제 해결

참조 형식이면 상관이 없지만, 값형식일 경우는 제너릭을 사용하는게 좋다.

4. 1) 제약1 - 상속타입 

   2) 제약2 - 값/참조 타입

   3) 제약3 - 인자 없는 생성자 필수 



c# 2.0 - Nullable 타입

.net 2.0 BCL: Nullable<T> 구조체 추가

c#의 경우 T? 형태로 단축 표기



C# 3.0 자동 구현 속성

- Field + Property 구현을 단순화

- Get/Set의 접근 제한자


C# 3.0 컬렉션 초기화

- ICollection 인터페이스를 구현한 타입

- 컬렉션의 요소를 new 구문에서 추가


C# 3.0 - LINQ

- LINQ : Language-Inegrated Query

-> 언어에 통합된 쿼리 표현식(Query Expressions)

-SQL 쿼리의 SELECT와 유사 


C# 3.0 - var 예약어

- 컴파일러가 로컬 변수의 형식을 추론

- C++ 11의 auto 예약어와 동격


C# 3.0 - 객체초기화(1)

- 공용 속성을 통해 객체 생성시에 초기화

- LINQ에 사용 anonyumous type

- 컬렉션 초기화 + 객체 초기화


C# 3.0 - 익명 타입

이름 없는 타입

- 내부적인 처리는 익명 메서드와 유사

- var 사용은 필수

- Linq Select,Join


C# 3.0 - 확장메서드

- 정적 메서드를 마치 인스턴스 메서드처럼 사용

- 결국 정적 메서드 호출

- 쿼리 구문과 메서드 기반 구문 (53분)

- WEHER

- ORDER BY


C# 3.0 람다 식

- 추론을 통해 delegate 익명 메서드 개선

- 값 반환 + 단문 메서드 -> return + 중괄호 생략

- 메서드 기반 쿼리를 단순화.

- 데이터로써의 람다 => Expression Tree

- Exptression Tree 컴파일

- SQL 쿼리를 생성

  LINQ TO SQL 실행 시 실제 쿼리로 생성이 된다.

- 사례2) 공용 속성 이름

  LINQ to...

  표준 쿼리 연산자


C# 4.0 - 선택적 매개 변수

선택적 매개변수

-C++의 디폴트 매개변수


C# 4.0 - 명명된 인자.

-인자의 이름으로 호출 측에 값 전달


C# 4.0 - dynamic 

-실행 시에 결정되는 타입

-결국엔 object 타입

-IronPython과 C#

-C#에서 IronPython 메서드 연동

'


C# 5.0 - 호출자 정보 (다시 봐야함)

C++의 3가지 메크로 상수에 대응


C# 5.0 - async-await

-마치 동기 방식처럼 비동기 호출

-사용자 정의 ...Async 메서드












'.NET 개발 > C#' 카테고리의 다른 글

C# Skia Sharp 사용해보기 (예제편) 1탄  (0) 2016.09.23
Webp C#  (0) 2016.09.23
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,

대리자는 메소드의 참조 혹은 콜백으로서 명령어들을 코드로 만든 다음 바로 호출하는 방식보다 다른 위치의 명령어의 집합을 호출할 수 있도록 전달하는 강력한 개념이다.


C# 3.0 에서는 Lambda 식을 소개하고 있고 

C# 2.0 에서는 익명 메소드 문법을 대체한다. (익명 메소드는 사라진게 아니다)


이런 닷넷의 특징들은 메소드 내에서 동적으로 명령들을 수행하는데 있어, 굉장한 유연성을 제공한다.

이것이 바로 LINQ라는 통합 언어 징의 (Language Integrated Query API를 이용해서 컬렉션에 대해 프로그래밍을 한결 쉽게 해주는 기능이다.


람다 식은 문 람다와 식 람다 두가지를 포괄한다. 

식 트리의 대한 개념과 대리자 구현 그대로가 아닌 람다 식의 의미론적인 분석을 표현하는 부분은

Linq to SQL 과 Linq to XML과 같은 컨텍스트 내에서 식트리를 해석하는 라이브러리의 핵심적인 특징이다.


example. 1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class Program
    {
        public enum SortType
        {
            Ascending,
            Desending
        }
 
        static void Main(string[] args)
        {
 
            ComparisonHandler c = (int first, int second) => { return first > second; };
            Func<int,int,bool> f = c.Invoke;
 
 
            int[] items = new int[] { 1121354};
 
            //문 람다
            //var result = BubbleSort(items, (int first, int second) => { return first > second;});
 
            //식 람다
            var result = BubbleSort(items, (int first, int second) => first > second);
 
            //익명 메소드
            //var result = BubbleSort(items, delegate(int first, int seconde){return first > seconde;});
 
            //매개변수가 없는 익명 메소드
            //var result = BubbleSort(items, delegate { return Console.ReadLine() != ""; });
            
 
            foreach (var item in result)
            {
                Console.WriteLine(item.ToString());
            }
 
            Console.ReadLine();
        }
 
        public static bool GreaterThan(int first, int second)
        {
            return first > second;
        }
 
        public static bool AlphabeticalGreaterThan(int first, int second)
        {
            int comparison;
 
            comparison = (first.ToString().CompareTo(second.ToString()));
 
            return comparison > 0;
        }
 
        public delegate bool ComparisonHandler(int first, int seconde);
 
        static int[] BubbleSort(int[] items, Func<int,int,bool> comparisonHandler)
        {
            int i;
            int j;
            int temp;
 
            if (items != null)
            {
                for (i = items.Length - 1; i >= 0; i--)
                {
                    for (j = 1; j <= i; j++)
                    {
                        if (comparisonHandler(items[j-1], items[j]))
                        {
                            temp = items[j - 1];
                            items[j - 1= items[j];
                            items[j] = temp;
                        }
                    }
                }
            }
 
            return items;
        }
 
        static int[] BubbleSort(int[] items, SortType sortOder)
        {
            int i;
            int j;
            int temp;
 
            if(items != null)
            {
                for ( i = items.Length - 1; i >= 0; i--)
                {
                    for ( j = 1; j <= i; j++)
                    {
                        bool swap = false;
 
                        switch(sortOder)
                        {
                            case SortType.Ascending:
                                swap = items[j - 1> items[j];
                                break;
                            case SortType.Desending:
                                swap = items[j - 1< items[j];
                                break;
                        }
 
                        if(swap)
                        {
                            temp = items[j - 1];
                            items[j - 1= items[j];
                            items[j] = temp;
                        }
                    }
                }
            }
 
            return items;
        }
    }
cs


example 2.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 List<string> stList = new List<string>() { "a""b""c""f""d""g" };
 
            var selection = stList.Where((st, index) =>
            {
                var item = index.ToString();
 
                if (st == "a" && index == 0)
                    return true;
                else
                    return false;
            });
 
            foreach (var item in selection)
            {
                Console.WriteLine(item);
            }
 
cs


'.NET 개발 > C#' 카테고리의 다른 글

Webp C#  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
Posted by Hoya0415
,

lambda expression

.NET 개발/C# 2016. 6. 5. 15:36

식 트리가 데이터의 컬렉션이며 반복처리를 거쳐 다른 형태의 자료로 변환 할 수 있다는 점이 중요하다.

식 트리를 자기 기술적 문자열로 변환해서 다른 질의 언어로 변환하는 것도 얼마든지 가능하다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Program
    {
        static void Main(string[] args)
        {
            Expression<Func<intintbool>> expression;
 
            expression = (x, y) => x > y;
 
            Console.WriteLine("--------------{0}---------------",expression);
 
            PrintNode(expression.Body, 0);
 
            Console.WriteLine();
            Console.WriteLine();
 
            expression = (x, y) => x * y > x + y;
 
            Console.WriteLine("--------------{0}---------------", expression);
 
            PrintNode(expression.Body, 0);
 
            Console.WriteLine();
            Console.WriteLine();
        }
 
        private static void PrintNode(Expression expression, int indent)
        {
            if (expression is BinaryExpression)
                PrintNode(expression as BinaryExpression, indent);
            else
                PrintSingle(expression, indent);
        }
 
        private static void PrintNode(BinaryExpression expression, int indent)
        {
            PrintNode(expression.Left, indent + 1);
            PrintSingle(expression, indent);
            PrintNode(expression.Right, indent + 1);
 
 
        }
 
        private static void PrintSingle(Expression expression, int indent)
        {
            Console.WriteLine("{0," + indent * 5 + "}{1}""", NodeToString(expression));
        }
 
        private static string NodeToString(Expression expression)
        {
            switch (expression.NodeType)
            {
                case ExpressionType.Multiply:
                    return  "*";
                case ExpressionType.Add:
                    return "+";
                case ExpressionType.Divide:
                    return "/";
                case ExpressionType.Subtract:
                    return "-";
                case ExpressionType.GreaterThan:
                    return ">";
                case ExpressionType.LessThan:
                    return "<";
                default : return expression.ToString() + " (" + expression.NodeType.ToString() + ")";
            }
        }
    }
cs


'.NET 개발 > C#' 카테고리의 다른 글

C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
WebSecurity 클래스  (0) 2015.12.03
Posted by Hoya0415
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  class Program
    {
        static void Main(string[] args)
        {
            //반공변성 
            Action<object> broadAction = (object data) =>
            {
                Console.WriteLine(data);
            };
 
            Action<string> narrowAction = broadAction;
 
            // 공변성
            Func<string> narrowFunction = () => Console.ReadLine();
 
            Func<object> broadFunction = narrowFunction;
 
            
            //반공변성과 공변성 조합
 
            Func<objectstring> func1 = (object data) => data.ToString();
            Func<stringobject> func2 = func1;
 
            var items = new string[] { "Moe""Larry""Curly" };
            var actions = new List<Action>();
             
            for (int i = 0; i < items.Count(); i++)
            {
                int j = i;
                Console.WriteLine(items[j]);
                actions.Add(() => { Console.WriteLine(items[j]); });
            }
            //foreach (string item in items)
            //{
            //    actions.Add(() => { Console.WriteLine(item); });
            //}
 
            foreach (Action action in actions)
            {
                action();
            }
 
        }
    }
cs


'.NET 개발 > C#' 카테고리의 다른 글

대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
WebSecurity 클래스  (0) 2015.12.03
NamedPipeClientStream 에러 : System.UnauthorizedAccessException  (0) 2015.11.17
Posted by Hoya0415
,

Xaml web browser application 을 업데이트 할 경우 캐시를 지워줘야함


Visual Studio 명령 프롬프트를 실행해서 아래 메세지를 치면 된다. 

mage -cc


명령 프롬프트 창이 없으면, cmd에서 아래의 명령어를 치면 된다.

rundll32 %windir%\system32\dfshim.dll CleanOnlineAppCache


'.NET 개발 > C#' 카테고리의 다른 글

lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
WebSecurity 클래스  (0) 2015.12.03
NamedPipeClientStream 에러 : System.UnauthorizedAccessException  (0) 2015.11.17
명명된 파이프  (0) 2015.11.11
Posted by Hoya0415
,

WebSecurity

사용자 계정을 만들고, 사용자를 로그인/로그아웃하며, 암호를 다시 설정하거나 변경하고, 관련 작업을 수행하는 등 ASP.NET 

웹 페이지 응용 프로그램에 보안 및 인증을 제공합니다.

Posted by Hoya0415
,

NamedPipeServerStream와 NamedPipeClientStream Pipe 로 연결 시 에러가 낫다.



테스트 환경에서 에러가 나지 않았는데 왜 그럴까..

구글링을 통해 찾아냈고, 먼저 찾아내신 개발자 분이 계셔서 기록을 남기게 되었다.

클라이언트쪽에서 연결시 에러가 났는데, 서버쪽 코드는 아래와 같다.

1
2
3
4
5
var pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.In, numThreads);
 
var threadId = Thread.CurrentThread.ManagedThreadId;
 
pipeServer.WaitForConnection();
cs

PipeDirection.In 으로 한 이유는 서버쪽에서는 클라이언트에게 데이터를 넘길 필요가 없어서였다.

그런데 양쪽 방향으로 해줘야 연결이 된다..

1
2
3
var pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.InOut, numThreads);
var threadId = Thread.CurrentThread.ManagedThreadId;
pipeServer.WaitForConnection();
cs


이건 단지 해결방법이었고, 원인은 추가적으로 올릴 기회가 있으면 올리겠습니다.~

출처 : http://adventuresindevelopment.blogspot.kr/2008/07/named-pipes-issue-systemunauthorizedacc.html

'.NET 개발 > C#' 카테고리의 다른 글

Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
WebSecurity 클래스  (0) 2015.12.03
명명된 파이프  (0) 2015.11.11
C# MailMessage 클래스로 네이버 메일 이용하기.  (0) 2015.11.10
EntityFramework 활용하기.  (0) 2015.11.09
Posted by Hoya0415
,

명명된 파이프

.NET 개발/C# 2015. 11. 11. 14:09

명명된 파이프

위키백과, 우리 모두의 백과사전.

명명된 파이프(named pipe) 또는 지명 파이프는 유닉스 및 유닉스 계열의 일반 파이프를 확장 한 것으로, 프로세스 간 통신 기법 중 하나이다. 그 개념은 마이크로소프트 윈도도 있지만, 의미는 크게 다르다. 일반 파이프는 ‘이름’이며, 사용하는 프로세스가 실행 중에만 존재한다. 명명된 파이프는 영구 프로세스가 소멸해도 계속 존재하기 때문에 사용하지 않으면 제거할 필요가 있다. 명명된 파이프 파일과 같이 취급할 수 있고 프로세스 간 통신(IPC)을 위해 프로세스가 오픈되어 사용한다. 또한 동작에서 명명된 파이프를 FIFO로 부르기도 한다.



Posted by Hoya0415
,