1. 외부 시스템에 제공할 서비스 또는 객체 정보를 직접적인 class가 아닌 "선언" 만을 제공한다.

2. 다중 상속에 따른 class의 표현을 여러가지로 가능하게 한다.

C Pattern(C로 만드는 Interface)

Java에서는 객체지향, 패턴, Interface을 빼놓고는 아무것도 아닙니다. Interface를 사용해야 언제든지 교체가능한 모듈형태의 프로그래밍을 할 수 있습니다.
Interface의 필요성에 대해서는 다른 곳에도 많이 나와 있기때문에 따로 설명하지 않겠습니다. C로 Interface를 만들어 보겠습니다. 이번에 만들 Interface는 UART입니다.
UART는 MCU와 Device와의 커뮤니케이션 도구로 많이 사용합니다. 예를 들면 GPS Module, RS232를 통한 PC와의 통신 등등에서 사용되므로 Interface를 설명하기에 적합합니다. 

typedef struct
{
    InitFunction Init;
    OpenFunction Open;
    TxHandlerFunction TxHandler;
    RxHandlerFunctioin RxHandler;
    //....(필요시 추가)

}UartInterface;



우선 UART interface를 만들었습니다. 이 interface를 이용해서 GPS Device Interface를 만들어 보겠습니다.

GpsUart.c 에는 다음과 같은 코드가 들어가야 합니다.

void CreatGpsUart(UartInterface *uart)
{
  uart->Open = GpsUartOpen;
  uart->TxHandler = GpsTxHandler;
  uart->RxHandler = GpsRxHandler;
}
void GpsUartOpen()
{
//
}
void GpsTxHandler()
{
//
}

void GpsRxHandler()
{
//
}

Rs232.c 에는 다음과 같은 코드가 들어가야 합니다.

CreatRs232Uart(UartInterface *uart)
{
  uart->Open = Rs232UartOpen;
  uart->TxHandler = Rs232TxHandler;
  uart->RxHandler = Rs232RxHandler;
}
void Rs232UartOpen()
{
//
}

void Rs232TxHandler()
{
//
}

void Rs232RxHandler()
{
//
}

이제 Main.c를 살펴보겠습니다.

UartInteface gGpsUart;
UartInteface gRs232Uart;

void main(void)
{
    CreatGpsUart(&gGpsUart);
    CreatRs232Uart(&gRs232Uart);

    //...
}

UartInterface를 통해 두가지 기능을 만들어 냈습니다. 

/*
interface는 규약이다. usb를 예로 들어보면(?) */

windows os를 사용하는 노트북에 usb를 꽂는다. 이 usb가 어느제조업체에서 만들었는지 알수있는
windows 제어판을 제공한다고 하자.

usb를 만드는 제조업체는 반드시 제조업체와 만든날짜 그리고 버젼을 등록하고 싶다.
windows os의 개발도구 interface를 이용해서 가능하게 할수 있다.

 

interface ____usb_register
{
    public void register_company();
    public void register_version();
    public void register_date();
}

위의 interface를 상속해서 반드시 구현해 주어야 windows os에 usb를 꽂으면 제어판에서 usb의 개략정보를
확인할수 있다.
즉 usb제조업체에서 위의 ____usb_register interface를 상속해서 메소드를 구현해주어야 한다.

/*interface는 규약이다. 반드시 interface상속을 했으면 규약대로 구현을 해야 한다.
상속했는데, 구현을 안했다면 위배가 된다.
usb를 예로 들수 있다. usb를 만든업체는 windows라는 os에서 동작하도록 하려면
windows os에서 규약해놓은 interface의 대부분을 구현해줘야 usb를 노트북이나 데스크탑에 꽂았을때에
제대로 동작하는것이다. usb를 만들어서 windows os에서 동작하려면, windows os의 interface규약집을 참조하여
구현하여야 할것이다. 그러므로 method의 선언만 되어 있을뿐, 구현되는부분은 usb제조사에서 구현해서
사용해야 한다.*/

using System;

interface IAnimal
{
void Eat();
}

interface IAnimalDrink
{
void Drink();
}

class Person : IAnimal,IAnimalDrink
{
public void Eat()
{
Console.WriteLine("Rice.Shape Eating,,,,!!");
}
public void Drink()
{
Console.WriteLine("Water.Shape Drinking,,,,!!");
}
}

class Lion : IAnimal,IAnimalDrink
{
public void Eat()
{
Console.WriteLine("Meat.Shape Eating,,,,!!");
}
public void Drink()
{
Console.WriteLine("Water.Shape Drinking,,,,!!");
}
}

class Camel : IAnimalDrink
{
public void Eat()
{
Console.WriteLine("Green.Shape Eating,,,,!!");
}
public void Drink()
{
Console.WriteLine("Water.Shape Drinking,,,,!!");
}
}

class Program
{
static void Main(string[] args)
{
Person myPerson = new Person();
Lion myLion = new Lion();
Camel myCamel = new Camel();

ExecuteInterface(myCamel);
ExecuteInterface(myPerson);
ExecuteInterface(myLion);
}
private static void ExecuteInterface(object obj)
{
IAnimal target1 = obj as IAnimal;
if (target1 != null)
{
target1.Eat();
}

IAnimalDrink target2 = obj as IAnimalDrink;
if (target2 != null)
{
target2.Drink();
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceUnderstand
{
    interface IPower
    {
        void action();
    }

    interface IBoot
    {
        void action();
    }

    class NoteBook : IPower, IBoot
    {
        void IPower.action()
        {
            Console.WriteLine("NoteBook::IPower.action() 호출.");
        }

        void IBoot.action()
        {
            Console.WriteLine("NoteBook::IBoot.action() 호출.");
        }
    }

class DesktopPC : IPower, IBoot
    {
        void IPower.action()
        {
            Console.WriteLine("DesktopPC::IPower.action() 호출.");
        }

        void IBoot.action()
        {
            Console.WriteLine("DesktopPC::IBoot.action() 호출.");
        }
    }

class Program
{
static void Main(string[] args)
        {
/*NoteBook을 Handling*//*NoteBook을 Handling*//*NoteBook을 Handling*/
/*NoteBook을 Handling*//*NoteBook을 Handling*//*NoteBook을 Handling*/
            NoteBook mc = new NoteBook();
            
            IPower imca = mc;
            imca.action();

            IBoot imcb = mc;
            imcb.action();

/*DesktopPC를 Handling*//*DesktopPC를 Handling*//*DesktopPC를 Handling*/
/*DesktopPC를 Handling*//*DesktopPC를 Handling*//*DesktopPC를 Handling*/
DesktopPC mcc = new DesktopPC();
            
            IPower imcaa = mcc;
            imcaa.action();

            IBoot imcbb = mcc;
            imcbb.action();
        }
}
}



c# using문 입니다.

MSDN을 인용하여 using문을 설명 드리자면 IDisposable 객체의 올바른 사용을 보장하는 편리한 구문을 제공해 주는 것이 바로 using문 입니다.

File및 Font와 같은 클래스들은 관리되지 않는 리소스에 액세스 하는 대표적인 클래스들입니다. 
File및 Font와 같은 클래스들은 관리되지 않는 리소스에 액세스 하는 대표적인 클래스들입니다.
File및 Font와 같은 클래스들은 관리되지 않는 리소스에 액세스 하는 대표적인 클래스들입니다.
File및 Font와 같은 클래스들은 관리되지 않는 리소스에 액세스 하는 대표적인 클래스들입니다.
File및 Font와 같은 클래스들은 관리되지 않는 리소스에 액세스 하는 대표적인 클래스들입니다.
File및 Font와 같은 클래스들은 관리되지 않는 리소스에 액세스 하는 대표적인 클래스들입니다.

이 말은 해당 클래스들을 다 사용한 후에는 적절한 시기에 해제(Dispose)하여 해당 리소스(자원)을 다시 반납해야 하는 것입니다.

프로그래머가 프로젝트를 하면서 매번 관리되지 않는 리소스에 액세스 하는 클래스들을 체크하여 Dispose 하는 것을 많은 시간과 실수를 야기합니다..이때 바로 using문을 이용하면 해당 리소스 범위를 벗어나게 되면 자동으로 리소스(자원)을 해제(Dispose)하여 관리를 쉽게 도와 줍니다.

Using문 사용한 경우

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

Using문 사용하지 않은 경우

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

Using문 사용한 경우

void Create()
{
int result;
using (StreamReader rdr = new StreamReader("CreateDB.sql"))
{
string sql = rdr.ReadToEnd();
SQLiteCommand cmd  = new SQLiteCommand(sql, Conn);

try
{
result = cmd.ExecuteNonQuery();
}
catch(SQLiteException ae)
{
Console.WriteLine(ae.ToString());
}
}
}

using문을 사용하면 프로그래머가 일일이 Dispose를 해주지 않아도 되고 로직도 간단해지는 것을 확인 하실 수 있습니다.







/*
싱글톤 패턴(Singleton Pattern)

1. 싱글톤 패턴

애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다. (자바에선 생성자를 private로 선언해서 생성 불가하게 하고 getInstance()로 받아쓰기도 함)
=> 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.
(인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라, 동일(기존) 인스턴스를 사용하게함)

2. 싱글톤 패턴을 쓰는 이유

고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음
또한 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용.
(쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체등)
안드로이드 앱 같은 경우 각 액티비티나 클래스별로 주요 클래스들을 일일이 전달하기가 번거롭기 때문에 싱글톤 클래스를 만들어 어디서나 접근하도록 설계하는 것이 편하기 때문...
+ 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용.
+ 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아지는 장점!

3. 싱글톤 패턴의 문제점

싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)
따라서 수정이 어려워지고 테스트하기 어려워진다.
또한 멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있음
*/

/*
공통데이타 저장변수를 사용시에 필요한부분이다.*/

public class APMMemory
{
private static APMMemory apmMemory;
string ____processid;

public static APMMemory GetInstance
{
get
{
if(apmMemory == null)
{
apmMemory = new APMMemory();
}
return apmMemory;
}
}

public string processid
{
get {return ____processid};
set { ____processid = value;}
}
}

class SampleManage
{
public void running()
{
Console.WriteLine("" + APMMemory.GetInstance.processid);
}
}

class Program
{
public static void Main()
{
APMMemory.GetInstatnce.processid = "999";

SampleManage nm = new SampleManage();
nm.running();
}
}

/* DLL등록후(D:\tmp\console\sqlite3.dll) PATH설정후 컴파일&실행 

>basic compile
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" sql11.cs

>error message
처리되지 않은 예외: System.IO.FileNotFoundException: 파일이나 어셈블리 'System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 지정된 파일을 찾을 수 없습니다.
   위치: SQLiteManageConsole..ctor()
   위치: Program.Main()
   
>solution
파일이나 어셈블리 ‘System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139’ 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 프로그램을 잘못된 형식으로 로드하려고 했습니다.
이런 오류가 발생하는 경우는 컴파일 환경이 64bit로 되어 있어서 발생합니다.
구성 관리자로 이동을 해서 플랫폼을 Any CPU에서 x86으로 바꾸면 정상적으로 동작합니다.

>platform addition
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" /platform:"x86" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" /platform:"x86" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" /platform:"x86" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" /platform:"x86" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" /platform:"x86" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" /platform:"x86" sql11.cs
csc.exe /r:"C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll" /platform:"x86" sql11.cs

>success compile
*/

using System;
using System.IO;
using System.Data.SQLite;


class Program
{
public static void Main()
{
SQLiteManageConsole nm = new SQLiteManageConsole();
nm.running();
}
}

class SQLiteManageConsole
{
//definition
const int sqlCmdLine=1;

//variables
SQLiteConnection Conn=null;

void SQLiteSys____Open()
{
Conn = new SQLiteConnection("Data Source=:memory:;Version=3;");
Conn.Open();
}
void SQLiteSys____Create()
{
int result;
using (StreamReader rdr = new StreamReader("D:\tmp/console/CreateDB.sql"))
{
string sql = rdr.ReadToEnd();
SQLiteCommand cmd  = new SQLiteCommand(sql, Conn);

try
{
result = cmd.ExecuteNonQuery();
}
catch(SQLiteException ae)
{
Console.WriteLine(ae.ToString());
}
}
}
void SQLiteSys____Insert()
{
string[] sql = new string[]
{
"insert into imt_mst_resource(resid, hostid, restype, resname) values('100101', '1001', 'linux', 'iuli_linux');",
};
int kk;

for(kk=0; kk<sqlCmdLine; kk++)
{
SQLiteCommand cmd  = new SQLiteCommand(sql[kk], Conn);

try
{
int result = cmd.ExecuteNonQuery();
}
catch(SQLiteException ae)
{
Console.WriteLine(ae.ToString());
}
}
}
void SQLiteSys____Select()
{
string sql = "select resid, hostid, restype, resname from imt_mst_resource;";
SQLiteCommand cmd  = new SQLiteCommand(sql, Conn);
SQLiteDataReader rdr = cmd.ExecuteReader();

int kk=1;

while(rdr.Read())
{
try
{
string resid   = rdr["resid"].ToString();
string hostid  = rdr["hostid"].ToString();
string restype = rdr["restype"].ToString();
string resname = rdr["resname"].ToString();

Console.WriteLine(">>>[" + kk.ToString("0000") + "]    :" + resid + "/" + hostid + "/" + restype + "/" + resname);
kk++;
}
finally
{
//
}
}
rdr.Close();
}
public void running()
{
SQLiteSys____Open();
SQLiteSys____Create();
SQLiteSys____Insert();

SQLiteSys____Select();
}
}







 

/*1. SQLite를 설치한(Install) 후에
2. SQLite DLL을 프로젝트에 참조한 후에*/

using System;
using System.Data.SQLite;

class Program
{
public static void Main()
{
SQLiteManageCls nm = new SQLiteManageCls();
nm.running();
}
}

class SQLiteManageCls
{
string connectionString = "Data Source=:memory:"; 
SQLiteConnection sqliteConnection = null; 
SQLiteCommand sqliteCommand = null;

public void running()
{
try 

sqliteConnection = new SQLiteConnection(connectionString); 
sqliteConnection.Open(); 
string sql = "SELECT SQLITE_VERSION()"; 
sqliteCommand = new SQLiteCommand(sql, sqliteConnection); 
string version = sqliteCommand.ExecuteScalar().ToString(); 
Console.WriteLine("SQLite version : {0}", version); 
}
catch(SQLiteException sqliteException) 

Console.WriteLine("Error: {0}", sqliteException.ToString()); 

finally 
{
if(sqliteCommand != null) { sqliteCommand.Dispose(); }
if(sqliteConnection != null) 
{
try 

sqliteConnection.Close(); 

catch(SQLiteException sqliteException) 

Console.WriteLine("Closing connection failed."); 
Console.WriteLine("Error: {0}", sqliteException.ToString()); 

finally 

sqliteConnection.Dispose(); 
}
}
}
}
}

/*c# *.DLL IDE에 추가하기*/

새로운 using 구문을 사용하기 위해서 예를들어서 using System.Data.SQLite;


DLL을 함께 추가해줘야 한다. 

1. Visual Studio(IDE)에서

2. Project 트리에서

3. 참조

4. 참조추가

5. 찾아보기로 해당 DLL을 클릭후에 확인(full path)

빌드후에 정상적으로 실행이 되는지 확인한다.

SQLite을 설치한 후에 C# 프로젝트에서 System.Data.SQLite.dll를 참조한 후 using System.Data.SQLite; 네임스페이스를 참조하면, SQLite의 .NET 클래스들 (예: SQLiteConnection, SQLiteCommand, SQLiteDataReader 등)을 사용할 수 있다.

using System;  
using System.Collections.Generic;  
using System.Net;  
using System.Net.Sockets;  
using System.IO;  
using System.Text;  
 
namespace FileTransfer  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            // Listen on port 31234    
            TcpListener tcpListener = new TcpListener(IPAddress.Any, 31234);  
            tcpListener.Start();  
 
            Console.WriteLine("Server started");  
 
            //Infinite loop to connect to new clients    
            while (true)  
            {  
                // Accept a TcpClient    
                TcpClient tcpClient = tcpListener.AcceptTcpClient();  
 
                Console.WriteLine("Connected to client");  
 
                StreamReader reader = new StreamReader(tcpClient.GetStream());  
 
                // The first message from the client is the file size    
                string cmdFileSize = reader.ReadLine();  
 
                // The first message from the client is the filename    
                string cmdFileName = reader.ReadLine() + "_1";  
 
                int length = Convert.ToInt32(cmdFileSize);  
                byte[] buffer = new byte[length];  
                int received = 0;  
                int read = 0;  
                int size = 1024;  
                int remaining = 0;  
 
                // Read bytes from the client using the length sent from the client    
                while (received < length)  
                {  
                    remaining = length - received;  
                    if (remaining < size)  
                    {  
                        size = remaining;  
                    }  
 
                    read = tcpClient.GetStream().Read(buffer, received, size);  
                    received += read;  
                }  
 
                // Save the file using the filename sent by the client    
                using (FileStream fStream = new FileStream(Path.GetFileName(cmdFileName), FileMode.Create))  
                {  
                    fStream.Write(buffer, 0, buffer.Length);  
                    fStream.Flush();  
                    fStream.Close();  
                }  
 
                Console.WriteLine("File received and saved in " + Environment.CurrentDirectory);  
            }  
        }  
    }  

using System;  
using System.Collections.Generic;  
using System.Net;  
using System.Net.Sockets;  
using System.IO;  
using System.Text;  
 
namespace FileTransferClient  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            try  
            {  
                Console.WriteLine("Please enter a full file path");  
                string fileName = Console.ReadLine();  
 
                TcpClient tcpClient = new TcpClient("127.0.0.1", 31234);  
                Console.WriteLine("Connected. Sending file.");  
 
                StreamWriter sWriter = new StreamWriter(tcpClient.GetStream());  
 
                byte[] bytes = File.ReadAllBytes(fileName);  
 
                sWriter.WriteLine(bytes.Length.ToString());  
                sWriter.Flush();  
 
                sWriter.WriteLine(fileName);  
                sWriter.Flush();  
 
                Console.WriteLine("Sending file");  
                tcpClient.Client.SendFile(fileName);  
 
            }  
            catch (Exception e)  
            {  
                Console.Write(e.Message);  
            }  
 
            Console.Read();  
        }  
    }  

/*
전제:TCP/IP의 중요한 성질

5. Flow control
송신자는 수신자가 받을 수 있는 만큼 데이터를 전송한다. 
수신자가 자신이 받을 수 있는 바이트 수 (사용하지 않은 버퍼 크기, receive window)를 송신자에게 전달한다. 
송신자는 수신자 receive window가 허용하는 바이트 수만큼 데이터를 전송한다.
*/

case1)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte)

case2)
send:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte) * 3

How to process such a case(?)
위의 2가지 조건을 모두 충족시킬수 있도록 서버측에서 프로그램이 구현되어야 할것이다.

TCP/IP
transmission control protocol/Internet protocol 

네트워크 간 전송 제어 프로토콜.
서로 다른 시스템을 가진 컴퓨터들을 서로 연결하고, 데이터를 전송하는 데 사용하는 통신 프로토콜들의 집합

 

데이터 전송

 

데이터 수신

 

스택 내부 제어 흐름(control flow)

 

인터럽트와 수신 패킷 처리

 

데이터 구조체

TCP control block

 

드라이버와 NIC의 통신

 

패킷 전송 과정을 따라가며 링을 어떻게 사용하는지 알아보자.

 

 패킷 수신 과정을 볼 수 있다.

 

 

스택 내부 버퍼와 제어 흐름(flow control)

 

 

 

 

 

 

성능 이해와 현상 분석을 하기 위해 운영체제의 TCP/IP 관련 코드 한 줄 한 줄을 모두 이해하고 있을 필요는 없다. 큰 흐름만 알고 있어도 많은 도움이 된다.

https://d2.naver.com/helloworld/47667

 

 

nohup 명령어는 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작 할 수 있게 해주는 명령어입니다.

코드에 줄 번호 표시
메뉴 모음에서 도구 > 옵션 을 차례로 선택합니다. 텍스트 편집기 노드를 확장한 다음, 사용 중인 언어나 모든 언어 를 선택하여 모든 언어에 줄 번호를 켭니다. (또는 검색 상자에 줄 번호 를 입력하고 결과에서 줄 번호 설정/해제 를 선택합니다.)

줄 번호 확인란을 선택합니다.

참고>
줄 번호는 코드에 추가되지 않으며 참조용으로만 사용됩니다.

 

/*
ToInt32(String) 의 예외처리

예외
FormatException
value가 선택적 부호와 숫자 시퀀스(0~9)로 구성되어 있지 않습니다.

OverflowException
value은(는) MinValue보다 작거나 MaxValue보다 큰 숫자를 나타냅니다.
*/
/*
//오버로드//오버로드//오버로드//오버로드//오버로드//오버로드//오버로드//오버로드//오버로드//오버로드
ToInt32(String)
숫자의 지정된 문자열 표현을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(UInt16)
지정된 16비트 부호 없는 정수의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(UInt32)
지정된 32비트 부호 없는 정수의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Single)
지정된 단정밀도 부동 소수점 숫자 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Object, IFormatProvider)
지정된 문화권별 서식 지정 정보를 사용하여, 지정된 개체의 값을 32비트 부호 있는 정수로 변환합니다.

ToInt32(String, IFormatProvider)
지정된 문화권별 서식 지정 정보를 사용하여, 숫자의 지정된 문자열 표현을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(String, Int32)
지정된 기수로 나타낸 숫자에 대한 문자열 표현을 32비트 부호 있는 정수로 변환합니다.

ToInt32(UInt64)
지정된 64비트 부호 없는 정수의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Object)
지정된 개체의 값을 32비트 부호 있는 정수로 변환합니다.

ToInt32(SByte)
지정된 8비트 부호 있는 정수의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Int64)
지정된 64비트 부호 있는 정수의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Int32)
지정된 32비트 부호 있는 정수를 실제 변환 작업 없이 반환합니다.

ToInt32(Int16)
지정된 16비트 부호 있는 정수의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Double)
지정된 배정밀도 부동 소수점 숫자 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Decimal)
지정된 10진수 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(DateTime)
이 메서드를 호출하면 InvalidCastException이 항상 throw됩니다.

ToInt32(Char)
지정된 유니코드 문자의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Byte)
지정된 8비트 부호 없는 정수의 값을 해당하는 32비트 부호 있는 정수로 변환합니다.

ToInt32(Boolean)
지정된 부울 값을 해당하는 32비트 부호 있는 정수로 변환합니다.
*/



string[] values = { "One", "1.34e28", "-26.87", "-18", "-6.00",
                    " 0", "137", "1601.9", Int32.MaxValue.ToString() };
int result;

foreach (string value in values)
{
   try {
      result = Convert.ToInt32(value);
      Console.WriteLine("Converted the {0} value '{1}' to the {2} value {3}.",
                        value.GetType().Name, value, result.GetType().Name, result);
   }
   catch (OverflowException) {
      Console.WriteLine("{0} is outside the range of the Int32 type.", value);
   }
   catch (FormatException) {
      Console.WriteLine("The {0} value '{1}' is not in a recognizable format.",
                        value.GetType().Name, value);
   }
}
// The example displays the following output:
//    The String value 'One' is not in a recognizable format.
//    The String value '1.34e28' is not in a recognizable format.
//    The String value '-26.87' is not in a recognizable format.
//    Converted the String value '-18' to the Int32 value -18.
//    The String value '-6.00' is not in a recognizable format.
//    Converted the String value ' 0' to the Int32 value 0.
//    Converted the String value '137' to the Int32 value 137.
//    The String value '1601.9' is not in a recognizable format.
//    Converted the String value '2147483647' to the Int32 value 2147483647.

/*특정 윈도우 Application에 Hook F5 Key 메세지 보내기*/

using NoName;
using NoName.Diagnostics;
using NoName.Text;//Encoding
using NoName.Runtime.InteropServices;

class HookingMessage
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int unMsg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

const UInt32 WM_KEYDOWN = 0x0100;
const int VK_F5 = 0x74;

public void running()
{
IntPtr ____handle_mmm=IntPtr.Zero;
bool ____toggle;

____handle_mmm = FindWindow(null, "CONSOLE.TRIS");
____toggle=PostMessage(____handle_mmm, WM_KEYDOWN, VK_F5, 0 );

if(____toggle==true) Console.WriteLine("PostMessage succ!!");
else Console.WriteLine("PostMessage fail!!");
}
}

class Program
{
public static void Main()
{
HookingMessage nm = new HookingMessage();
nm.running();
}
}



/*
namespace:System
Int To Double -> Convert.ToDouble(int or double)
Double to Int -> Convert.ToInt32(double)
*/

class TrisWidthHeight : Form
{
int titledepth, widthdepth, heightdepth;
public TrisWidthHeight()
{
titledepth = this.Height - this.ClientRectangle.Height;
titlewidth = Convert.ToInt32(Convert.ToDouble(titledepth / 10.0)) * 7
titleheight = Convert.ToInt32(Convert.ToDouble(titledepth / 10.0)) * 4
this.Width = titlewidth;
this.Height = titleheight;
}

 

Other Application기동을 클라이언트에서 하도록 수정(Other Application프로그램이 뛰워져 있지 않을경우에)
Other Application기동을 클라이언트에서 하도록 수정(Other Application프로그램이 뛰워져 있지 않을경우에)

____handle_mmm = FindWindow(null, "CONSOLE.TRIS");
if(____handle_mmm==IntPtr.Zero)
{
Console.WriteLine("Time:[" + DateTime.Now.ToString() + "]::" + "FindWindow(CONSOLE.TRIS) FAIL!!, Try Execute CONSOLE.TRIS Application!!");

Process process = Process.Start("____rcv.exe");

DateTime endTime = DateTime.Now.AddMinutes(1);

/*
System.Threading.Thread.Sleep(1000);
____handle_mmm = FindWindow(null, "CONSOLE.TRIS");
if(____handle_mmm==IntPtr.Zero) 
{
Console.WriteLine("Time:[" + DateTime.Now.ToString() + "]::" + "FindWindow(CONSOLE.TRIS) FAIL!!, Try Execute CONSOLE.TRIS Application!!");
}
*/

while(true)
{
if((____handle_mmm = FindWindow(null, "CONSOLE.TRIS"))==IntPtr.Zero)
{
System.Threading.Thread.Sleep(10);
}
else break;

if(endTime<DateTime.Now)
{
index=100;
break;
}
}
if(index==100) return;
}

 

 

____snd.cs
0.00MB

+ Recent posts