2012년 10월 22일 월요일

Resources in WPF (Binary Resources)

WPF 에서 사용하는 리소스는 두가지 타입이 있다.
1) Binary Resource
2) Logical Resource


Binary Resources

Binary Resource 는 로그 파일, 이미지 파일, AV 파일등이 사용된다.
리소스 파일 속성에 보면 WPF 에서 정의된 Build Action 옵션이 있다.

이 중 Binary Resource 는 'Resource', 'Content(내용)' 두가지 옵션이 많이 사용된다.

*) Build Action
   파일이 빌드 및 배포 프로세스와 연결되는 방법

Resource
어셈블리에 포함되는 리소스

Content(내용)
리소스가 어셈블리에 포함되지 않는다. 어셈블리에 Custom Attribute 인 AssemblyAssociatedContentFile 를 포함시킨다.
AssemblyAssociatedContentFile 어트리뷰트에는 사용할 리소스 파일의 상대 경로를 설정한다. 이 방법을 이용하면 리소스 파일을 프로젝트에 포함 시키지 않고서도 해당 리소스를 사용할 수 있다. 동적으로 생성되는 리소스 파일을 사용할 경우 유용하다.


Resource 와 Embedded Resource 의 차이

Resource 와 Contents 빌드 액션은 Uris를 사용하여 WPF 리소스에 접근한다.
Embedded Resource 는 WPF 이전부터 사용하던 리소스 사용 방법이다.
Resource 와 Embedded Resource 두 방법 모두 어셈블리에 리소스를 포함시키지만, Resource 빌드 액션은 WPF 에서  사용하는 방법이다.


Binary Resource 접근을 위한 URIs

"Logo.jpg" 
 "A/B/Logo.jpg"
 "D:\Resource\Logo.jgp"
 http://pinvoke.net/logo.jpg
ResourceDll;component/Logo.jpg 
ResourceDll;component/A/B/Logo.jpg 
pack://siteOfOrigin:,,,/logo.jpg 
pack://siteOfOrigin:,,,/A/B/logo.jpg 



*) 참고
- Resources in WPF  1 (Binary Resources)
- WPF Application Resource, Content, and Data Files - MSDN

@

2012년 10월 21일 일요일

[MS SQL Server] Configuration Functions (Transact-SQL)


Client측에서 연결한 MS SQL SERVER 에 대한 정보가 필요했다.
정확히 말해서는 MS SQL SERVER가 한국어로 설치 되었는지, 영어인지, 그 외 언어인지를 알아야 했다. 국가별로 시간 포멧이 상이하고, 그 에 따른 쿼리문을 만들어 줘야 했기 때문에.

@@LANGID 또는 @@LANGUAGE 를 사용했다.
@@LANGID 는 현재 사용하고 있는 언어의 로컬 언어 ID 값을 리턴한다.
@@LANGUAGE 는 현재 사용하고 있는 언어의 이름을 리턴한다.

*) @@LANGID 와 같은 값들을 전역 변수 또는 Configuration Function 이라고 한다.
    연결한 MS SQL SERVER 에 대한 정보를 얻을 수 있다.

*) 참조
Change the Default Language for SQL Server
Configuration Functions (Transact-SQL) - MSDN
[MSSQL] 전역변수를 알아보자
[mssql]기본 언어 확인

@

2012년 10월 10일 수요일

Marshaling LPCTSTR


C# (Managed code) 에서 C++ DLL (Unmanaged code) 의 다음과 같은 함수를 사용해야 할 경우가 있었다.

C++
void Func(LPCTSTR szKey);

C/C++ 기억이 가물가물 하지만.. LPCTSTR 타입은 다음과 같다.
UNICODE 을 정의할 경우 -> LPCWSTR (16-bit Unicode character) 즉, CONST WCHAR *
ANSI 일 경우 -> LPCSTR (8-bit ANSI character) 즉, CONST CHAR *

*) Windows API 는 ANSI string 과 Unicode (UTF-16) string 을 사용한다.
*) C# 은 Unicode (UTF-16) 을 사용한다.

LPCTSTR 의 대응되는 C# 타입은 [UnmanagedType.LPWStr] string 이다.

C++              C#
LPCTSTR -> [UnmanagedType.LPTStr] string


UnmanagedType 열거형
매개변수나 필드를 Unmanaged 코드로 어떻게 마샬링 할 것인지 지정하는 열거타입

UnmanagedType.LPWSTR
2바이트 null 로 끝나는 유니코드 문자열. Unmanaged 함수인 CoTaskMemAlloc 로 생성된 문자열에 대해서만 사용됨.
ANSI 문자열로 마샬링할 경우에는 UnmanagedType.LPSTR, Unicode 문자열로 마샬링할 경우에는 UnmanagedType.LPWSTR 을 사용하는 것 같다. 플랫폼 종속적인 경우에는 UnmanagedType.LPTSTR 을 사용해되 괜찮을것 같다.

MarshalAsAttribute
Managed 코드와 Unmanaged 코드 사이에 데이터를 어떻게 마샬링 할 것인지 지정한다. parameter, field, return value에 사용 가능하다.



*) Windows Data Types - MSDN
*) MarshalAsAttribute Class - MSDN
*) UnmanagedType 열거형 - MSDN
*) How to map Win32 types to C# types when using P/Invoke? - stackoverflow


@