검색결과 리스트
C#에 해당되는 글 78건
- 2015.12.07 [C#] SQL Lite 소소한 팁 하나.
- 2015.09.16 [C#] NetworkStream과 Serialize, DeSerialize
- 2015.08.07 [C#] Build Auto Update 2
- 2015.07.28 [C#] 작업 스케줄러 등록
- 2015.04.06 [C#] 다국어 지원 2
- 2013.09.28 [C#] Direct X 이용한 동영상 재생
- 2013.06.19 [C#] Serial Port
- 2013.05.10 [C#] Config File 경고 메세지 2
- 2012.08.01 [C#] DataGridView Column Header Sort 방지
- 2012.04.10 [C#] 활성화된 익스플로어 정보 알아내기
글
C#에서 SQLLite를.. 열고 닫고.. 하면 table is locked
-_-...
처음은 잘된다.. 근데.. 두번째 부터는 저런 메세지가 뜬다..
하지만 당황하지 말자..
open->close 끝이라 생각하면 바로 걸리니..
connection을 dispose 걸어주고 command까지 dispose 걸어주면 바로 해결이 된다..
당황스런 시츄에이션.. 이건 좀 ㅠㅠ 아닌거 같아 ㅠㅠㅠ
설정
트랙백
댓글
글
오랜만이라 그런가.. 적응이 안된? 뭐.. 그런.. 잠시의 작업으로
내 기억이라면 또 까먹기에..
NetworkStream으로 주고 받을 때도 Receive 될 시 대기가 된 다는 것은.. 알고 있던건데..
문제는.. DeSerialize...
Exception이 죽어라 떠 주시길래..
구글신이 응답을 주셨...다..
샘플 코드를 보면..
[Server]
sealed class AllowAllAssemblyVersionsDeserializationBinder : System.Runtime.Serialization.SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type typeToDeserialize = null;
String currentAssembly = Assembly.GetExecutingAssembly().FullName;
assemblyName = currentAssembly;
typeToDeserialize = Type.GetType(string.Format("{0},{1}", typeName, assemblyName));
return typeToDeserialize;
}
}
IPAddress address = IPAddress.Parse("192.168.1.143");
TcpListener server = new TcpListener(address, 7771);
server.Start();
while(true)
{
Socket sock = server.AcceptSocket();
if (sock.Connected)
{
NetworkStream nStream = new NetworkStream(sock);
MemoryStream mStream = new MemoryStream();
byte[] size = new byte[4];
int receivedData;
receivedData = nStream.Read(size, 0, size.Length);
mStream.Write(size, 0, receivedData);
Console.WriteLine(BitConverter.ToInt32(size, 0));
mStream.Seek(0, SeekOrigin.Begin);
byte[] buffer = new byte[BitConverter.ToInt32(size, 0)];
receivedData = nStream.Read(buffer, 0, buffer.Length);
mStream.Write(buffer, 0, receivedData);
BinaryFormatter bf = new BinaryFormatter();
bf.Binder = new AllowAllAssemblyVersionsDeserializationBinder();
mStream.Seek(0, SeekOrigin.Begin);
testData a = bf.Deserialize(mStream) as testData;
Console.WriteLine(a.test);
mStream.Close();
nStream.Close();
}
}
[Client]
static void Main(string[] args)
{
ArrayList a = new ArrayList();
testData data = new testData();
data.test = "test";
a.Add(data);
MemoryStream m = serialize(data);
m.Seek(0, SeekOrigin.Begin);
byte[] size = new byte[4];
byte[] buffer = m.ToArray();
size = BitConverter.GetBytes(buffer.Length);
TcpClient client = new TcpClient("192.168.1.143", 7771);
NetworkStream nStream = client.GetStream();
nStream.Write(size, 0, size.Length);
nStream.Write(buffer, 0, buffer.Length);
nStream.Close();
client.Close();
}
private static MemoryStream serialize(testData arr)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream mStream = new MemoryStream();
bf.Serialize(mStream, arr);
return mStream;
}
저~짝 Server에 보면 AllowAllAssemblyVersionsDeserializationBinder Class가 있다..
저 부분을 추가 해 주고 BinaryFormatter에 Bind 시켜주니..
이쁘게 잘된다..
그리고 다들 알다 시피 직렬화 할 때는 대상 Class 위에 [Serialize] 명시는 꼭 해주고..
또한.. 서로 다른 Library를 만들어 놓고 Class 내용만 같게 하는 일이 있다면.. 정말.. 혼나야겠고..
해 보면 죽어라 Exception이 일어나는 일을 만나게 될 것임돠.
테스트 해 봤더니 신날하게 나서 방법 없을라나 고민 해 봤지만 하다가 포기..
그냥 같은 library 쓰고 하면 되니까..
요새 손 안대던 부분까지 다시 하니까 기억이 가물 가물.. 나도 이제 끝인가ㅠ
설정
트랙백
댓글
글
AssemblyInfo에 있는 Version을 자동으로 바꾸게 될 일이 생겼다.
보통 AssemblyVersion("0.0.0.*") 으로 처리 하면 자동적으로 시간에 비례하여 업데이트가 되지만
일정한 카운터가 올라가지는 않는 것을 발견..
여기저기 참고를 하다가 다음과 같이 처리를 했다.
일단 AssemblyVesion.tt 라는 파일을 만들고
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>
<#
int major = 0;
int minor = 0;
string build = "0";
string revision = "0";
string Assem = string.Empty;
string error = "";
try
{
StreamReader reader = new StreamReader(Host.ResolvePath("version.snk"));
revision = reader.ReadLine().Trim();
revision = (int.Parse(revision.Trim()) + 1).ToString();
reader.Close();
StreamWriter writer = new StreamWriter(Host.ResolvePath("version.snk"), false);
writer.WriteLine(revision);
writer.Flush();
writer.Close();
}
catch (Exception e)
{
error = e.ToString();
major = 9999;
major = 9999;
build = "9999";
revision = "9999";
}
#>
using System.Reflection;
[assembly: AssemblyVersion("<#= major #>.<#= minor #>.<#= build #>.<#= revision #>")]
[assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= build #>.<#= revision #>")]
와 같이 코드를 넣었다.
내부적으로 카운터를 기록하기 위해서 version.snk 파일을 만들어 카운터 방안으로 삼아두고..
저 내부적 내용은 작성자마다 다르게 하면 되니.. 크게 신경 쓸 것은 없다.
그리고 빌드 이벤트에 아래와 같이 작성한다.
set textTemplatingPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
if %textTemplatingPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe" set textTemplatingPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
%textTemplatingPath% "$(ProjectDir)\Properties\AssemblyVersion.tt"
자.. 여기까지 되었다면.. 빌드하고자 하는 프로젝트를 정리하고 빌드를 한다. 그렇게 하면 자동 업데이트가 되어
수정되는 빌드 버전을 확인 할 수가 있을 것이다.
단 정리 <<< 를 해 줘야한다. 왜냐면 T4 디버그를 적용해야 하는 듯 하다.
tt 파일에서 ctrl + s를 하면 카운터가 변하는 것을확인 할 수 있는데 매번 빌드 할 때 그러기는 그렇고..
이래 저래 혼자 만지다 보니 정리하고 난 다음 빌드 하니 바뀌는 것을 확인 할 수가 있었다.
안해본거 조금씩 조금씩 한두개 손을 대보게 되네.. 흠냐..
나쁘진 않아..
설정
트랙백
댓글
글
정말 오랜만에 포스팅을 한번 해 보는듯..
윈도우 관리자 권한 덕분에.. 뜨는 팝업창 -_-..
싫다.. 그래서 윈도우 시작하면 프로그램 실행 하면 자동으로 실행되게..
윈도우 사마께서 알아서 실행되게 해 주는...
근데 이게 또 안에 설정을 따라 바꿔야하니까 엄청 짜증난다.
근데 4.5에서 Task TaskScheduler 이분이 날 구원하셨으니..(4.0에서도 됩니다.)
코드 플렉스에 가보면 아래와 같은 파일이 존재한다.
처음에 COM+가 없어서 정말 고민하다가..
여기 저기 다 뒤져보니 떡하니 존재하는 아름다운 자식 ㅠㅠ
Microsoft.Win32.TaskScheduler.dll
뭐 무튼 이놈을 참조하고!!
using (TaskService taskService = new TaskService())
{
TaskDefinition taskDefinition = taskService.NewTask();
//일반
taskDefinition.Principal.DisplayName = "이름";
taskDefinition.RegistrationInfo.Description = "설명";
LogonTrigger login = new LogonTrigger();
taskDefinition.Principal.UserId = string.Concat(Environment.UserDomainName, "\\", Environment.UserName);
taskDefinition.Principal.LogonType = TaskLogonType.InteractiveToken;
taskDefinition.Principal.RunLevel = TaskRunLevel.Highest;
taskDefinition.Triggers.Add(login);
//조건
taskDefinition.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew;
taskDefinition.Settings.DisallowStartIfOnBatteries = false;
taskDefinition.Settings.StopIfGoingOnBatteries = false;
taskDefinition.Settings.AllowHardTerminate = false;
taskDefinition.Settings.StartWhenAvailable = false;
taskDefinition.Settings.RunOnlyIfNetworkAvailable = false;
taskDefinition.Settings.IdleSettings.StopOnIdleEnd = false;
taskDefinition.Settings.IdleSettings.RestartOnIdle = false;
//설정
taskDefinition.Settings.AllowDemandStart = false;
taskDefinition.Settings.Enabled = true;
taskDefinition.Settings.Hidden = false;
taskDefinition.Settings.RunOnlyIfIdle = false;
taskDefinition.Settings.ExecutionTimeLimit = TimeSpan.Zero;
taskDefinition.Settings.Priority = System.Diagnostics.ProcessPriorityClass.High;
// 동작
taskDefinition.Actions.Add(new ExecAction(@"실행파일경로"));
// 등록
taskService.RootFolder.RegisterTaskDefinition("스케줄러 표시명", taskDefinition);
}
요런 코드를 넣어주면 들어간다.
만약 설정 내부 값이 잘못되면 등록에서 권한 문제 등을 일으키니까 정말 조심해야한다.
하나씩 코멘트를 달고 싶지만.. 각자가 알아서 하기!!
XML 추출은 작업 스케쥴러에서 내보내기 선택하면... 해당하는 내용을 볼 수가 있다.
그러면 각기 Setting에 대한 Element들을 통해서 원하는 방식으로 바꿔서 해 주면 된다.
4.5 관련해서 책을 잘 안봤더니...
하긴 책에도 이런건 없었던듯..
무튼 간만에 포스팅.. 삽질 끝!!
설정
트랙백
댓글
글
다국어 지원이 생각보다 편하다.
ko-KR, en-US 이렇게 직접적으로 할 필요가 없이
CultureInfo를 이용하여 CurrentCulture를 String 형태로 반환하면 현재 플랫폼의 상황을 알 수가 있다.
여지껏 한번도 이렇게 해 본 적이 없고.. 다국어 지원을 처음하다보니 생소하긴한데..
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureInfo.CurrentCulture.ToString());
ResourceManager manager = new ResourceManager("FMAClient.TextInfo", typeof(Form).Assembly);
형태로 하면 현재 지정된 리소스를 들고 올 수가 있다.
리소스.지원언어 형태로 해서 리소스를 추가 하면 위에서 찾은 지원 형태에 따라 자동으로 인식한다.
하나 주의점이 필요하다면.. 기본적인 리소스 파일을 Dummy 형태로 만들어 둬야한다.
그렇지 않을 경우 디자이너가 깨지거나 하는 경우를 볼 수가 있다.
지원하지 않은 언어에 대한 오류 메세지들이 등장한다.
manager.GetString("Conditions"); 형태로 해 주면 리소스에 저장한 이름의 데이터를 가져 올 수가 있다.
만약 한국어라면 ko-KR인데 생성 리소스 파일은 리소스명.ko-KR 이렇게 만들어 주면 자동으로 들어간다.
영어나 이런 경우 en-US인데 리소스명.en-US 파일을 만들어 두 리소스 파일을 비교 후 해당하는 리소스를 참조하는 형식이다.
참조해야하는 네임스페이스는 Resources, Globalization 이 두가지이다.
설정
트랙백
댓글
글
음.. 일단 샘플부터..
Microsoft.DirectX.AudioVideoPlayback.Video video;
video = new Microsoft.DirectX.AudioVideoPlayback.Video(@"C:\Wildlife.wmv");
video.Owner = this.panel1;
video.Size = this.panel1.Size;
if (video != null)
video.Play();
위와 같이 하면 일단 재생이 된다.
하지만 로더 관련된 예외가 발생 하는 경우가 있다.
이는 도구->디버그->예외->관리->LoderLock 체크를 해지 해 주면 된다.
하나 더 해서 RunTime에 관련되서 나올 때 4.0의 경우
config를 추가하여
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
내용을 넣어준다.
아 또한 VS2010부터는 참조에 직접 나타나지 않아 찾아보기로 선택 해 줘야한다. 간단하게 여기까지...
설정
트랙백
댓글
글
음.. Read 방식 자체가 두가지가 있긴한데 어느 것이 편한지는 사용하는 사람 재량인거 같다.
Read를 써서 Buffer 공간을 만들어서 하거나, ReadExisting 를 이용하여 Encoding 타입을 정해놓고 하거나..
Serial.Read(Buffer, start, end) 형식으로 해서 처리 한다면.. 이놈을 또 Encoding 해야하는 불편함이 있다는거?
거기다 하나 옵션을 넣자면 지정 Buffer 만큼 항상 들어온다고 딱 정의 할 수 있다는거 정도?
보다보니 느끼는건 그 정도인 듯하다.
그에 비해 ReadExisting 이놈은 입력 버퍼 자체에 있는 것을 해당 Encoding 형식에 맞춰서 String 형식으로 반환하니 매우 편하다는거?
사용자 재량에 따라 다르긴 하지만 이 두가지를 상황에 맞게 쓸 일이 온다면 잘 구분해서 쓰면 더 효율적이지 않을까 싶다.
아 -_-a DiscardInBuffer 요놈을 써서 입력 버퍼 지워주는거랑 DiscardOutBuffer 요놈을 써서 출력 버퍼 지우는건 당연한거고..
그냥 생각나서 주저리 주저리..
설정
트랙백
댓글
글
경고 1 'System.Configuration.ConfigurationSettings.AppSettings'은(는) 사용되지 않습니다. '"This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings ~~~~~
app.Config 파일을 참조 해서 사용 할 때
System.Configuration.ConfigurationSettings.AppSettings["블라블라"]
이용 할 시 나타난다.
이는 원래 System.dll에 포함이 되었으나 MS에서 'System.Configuration.dll로 분리를 시켰다.
이를 해결하고자 할 경우
System.Configuration.ConfigurationManager.AppSettings["블라블라"] 처럼 쓰면 된다.
물론 경고 메세지가 떠도 사용해도 별 문제 없이 작동은 하나 그래도.. 기왕이면!!
경고 메세지 없이 깔끔하게 쓰면 좋지 않을까!! 하면 위와 같이 이용한다.
단!! using System.Configuration; 요놈은 꼭 해주기!!
그러고 보니 정말 오랜만의 포스팅.. ㅠ_ㅠ
설정
트랙백
댓글
글
헤더 속성을 찾아봐도 모르겠고 해서.. 컬럼 자체를 방지를 시켰다.
컬럼 색을 바꾸고 할 경우 이 방법으로 그냥 묶어두고 한다면 헤더를 클릭 했을 때
작성자가 지정한 색상이 바뀌지를 않는다.
foreach (DataGridViewColumn column in dgv_Item.Columns)
{
column.SortMode = DataGridViewColumnSortMode.NotSortable;
}
설정
트랙백
댓글
글
사이트 여기 저기 돌아다녀보다가 알아두면 괜찮을거 같아서 끄적 끄적..
현재 윈도우 상에 열린 익스플로어의 URL이나 이름 등을 알아내는 코드 이다.
먼저 SHDocVw를 참조를 해 주고 다음과 같은 코드를 작성해 보자.
[DllImport("user32.dll")]
static extern int GetForegroundWindow();
foreach (InternetExplorer page in new ShellWindowsClass())
{
Console.WriteLine(page.LocationName);
Console.WriteLine(page.LocationURL);
Console.WriteLine(page.Name);
}
결과
Neo's :: 글쓰기
http://neofirst.tistory.com/admin/entry/post
Windows Internet Explorer
위에서 보면 저런 형식으로 나온다. 뭔가 체크를 할 떄 이용하면 괜찮을 듯 하다.
RECENT COMMENT