윈폼에서 유저컨트롤을 만들면. 도구상자에 추가가 되서. 일반 컨트롤처럼 사용할수가 있죠

유저컨트롤을 만들어서 쓰다 보면
속성을 추가하고 싶은 마음이 슬금슬금 생길수도 있는데

일반 속성 만드는거 처럼 만드니
디자인창에서 컨트롤속성을 봐도 추가가 되어있진 않더라구요

방법은?!!

[Category("속성명"),Description("설명")]


이렇게 하기만 해주면 됩니다. ㅋ

참 쉽죠잉!!!

[Category("IsNumber"), Description("숫자인지 여부")]
public bool IsNumber
{
       get;
       set;
}

이렇게 해주면 디자인창에서도 속성편집을 할수 있습니다.
by 피요히코~ 2010. 1. 13. 11:58
일단 만들어질 COM+을 사용할 기본 웹프로젝트를 하나 만들고
거기에 COM+ 을 구현하기 위한 프로젝트도 만들어줍니다~

대충 이런 모양이 됩니다.
웹프로젝트명은 Hello_Complus고. COM+ 프로젝트는 HelloComplus로 만들었어요
웹프로젝트에는 COM+에 대한 참조를 추가해주고
COM+ 프로젝트에는 System.EnterpriseServices를 추가해줍니다.

이제 COM+ 프로젝트에 Hello.cs라는 클래스를 추가해주고 코드를 작성해줍니다.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.EnterpriseServices;

namespace HelloComplus
{
    //public으로 해줘야 겠죠?!
    public class Hello : ServicedComponent
    {
        public Hello()
        {
            //생성자
        }

        public string SayHello()
        {
            return "Hello!!!";
        }
    }
}

이 상태에서 웹프로젝트에서 SayHello 메소드를 호출할수는 없어요
COM+을 사용하기 위해선 몇가지가 더 필요합니다.

COM+ 는 반드시 강력한 이름을 가져야 합니다.

명령프롬프트에서 명령어로 어셈블리에 강력한 이름으로 서명을 할 수 있습니다.
VS 도구에있는 명령 프롬프트를 실행해서
 sn -k HelloComplus.snk
해서 새로운 키쌍을 생성 한 후에
COM+프로젝트의 Properties 아래에 있는 AssemblyInfo.cs에서 해상 키 파일을 등록해주면 됩니다.

AssemblyInfo.cs에서 고쳐주어야 할 께.
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 
// 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오.
[assembly: ComVisible(true)]

ComVisible부분을 true로 해주는것과(기본은 false에요)
[assembly: AssemblyKeyFile("HelloComponent.snk")]

이렇게 만들어진 키 파일을 등록해 주면 됩니다.

(COM+이 강력한 이름을 가져야 하는 이유는 COM+가 시스템 레지스트리에 등록되어야 하기 때문이라고 합니다...)

그 후에는 COM+을 등록시켜주면 되는데요
좀전에 키파일을 만들때 처럼
명령 프롬프트에서

COM+프로젝트의 obj/Debug/ 에 들어가면 dll이 만들어져있잖아요. (아. 물론. 프로젝트를 컴파일해 줘야 합니다.)

regsvcs HelloComplus.dll 이라고 해주면 됩니다.

이 명령을 실행하기 전에 먼저. 해당 파일이 있는 경로까지 들어가야 해요.

그러면

이렇게 등록이 됩니다.
그럼 이놈은
레지스트리에도 등록이 되어있고
구성요소 서비스에도 등록이 됩니다.


찾아보면. 이렇게 등록되어 있는걸 볼수 있습니다.

이제 이 COM+이 사용이 되는지 간단하게 테스트를 해볼꼐요

웹프로젝트의 Default.aspx의 비하인드코드의 Load부분에 간단히 코드를 작성합니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HelloComplus;

namespace Hello_Complus
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Hello hello = new Hello();
            Response.Write(hello.SayHello());
        }
    }
}

그리고 실행을 하면


이렇게 나오네요

성공!!

근데. 한가지 문제아닌 문제가 있어요

COM+ 프로젝트를 빌드할때
오류는 없지만 경고가 뜹니다.


이런 오류인데요
아까 AssemblyInfo.cs에 키파일을 등록한 부분에서 나는 문제입니다.

사실 이렇게 나와도잘 되는데
(이게 .net framework와 vs 이전버전에서 사용했던 방법인가봐요)

그래도 이런 경고가 안나오게 하려면

    강력한 이름을 만들때 명령 프롬프트에서 sn으로 등록하지 말고
    COM+ 프로젝트의 속성에서 직접 만들어 줍니다.


이렇게만 하면
sn으로 키파일 만들고.
등록하고. 하는게 필요 없더라구요
(당연히 경고도 안나오죠..)

여기까지가 (아주)간단한 COM+ 만들기 였습니다.
by 피요히코~ 2010. 1. 6. 14:01
C:\Windows\Microsoft.NET\Framework\v2.0.50727\regsvcs.exe (등록할 dll 이 있는 Full Path)


ex) C:\Windows\Microsoft.NET\Framework\v2.0.50727\regsvcs.exe D:\PROJECT\Vision_Off\02_DAC\VLD.DAC\bin\Debug\VLD.DAC.dll
by 피요히코~ 2010. 1. 5. 16:50
텍스트 컨트롤중 하나
읽기전용

Inlines를 이용하여 여러 서식 적용 가능

XAML


        
            
                
                    Hello
                
                
                    World
                
                
                
                    Test
                
            
        
    

CS
           TextBlock tb_Test = new TextBlock();//TextBlock 만들고
            Run rn = new Run();//Run 만들고
            rn.Foreground = new SolidColorBrush(Colors.Yellow); //Foreground 설정
            rn.FontFamily = new FontFamily("Arial");//Font 설정
            rn.FontSize = 20;//Size 설정
            rn.Text = "Hello";//Text 설정

            tb_Test.Inlines.Add(rn); //추가

            Run rn2 = new Run();
            rn2.Foreground = new SolidColorBrush(Colors.Blue);
            rn2.FontSize = 10;
            rn2.Text = "World";

            tb_Test.Inlines.Add(rn2);
            tb_Test.Inlines.Add(new LineBreak()); //LineBreak추가

            Run rn3 = new Run();
            rn3.Foreground = new SolidColorBrush(Colors.Black);
            rn3.FontSize = 15;
            rn3.Text = "Test";

            tb_Test.Inlines.Add(rn3);

            LayoutRoot.Children.Add(tb_Test);


by 피요히코~ 2009. 11. 30. 22:57
XAML
<Grid x:Name="MyGrid" Width="400" Height="400" ShowGridLines="True">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
</Grid>

 

CS
Grid grid = new Grid();
grid.RowDefinitions.Add(new RowDefinition());
grid.RowDefinitions.Add(new RowDefinition());

grid.ColumnDefinitions.Add(new ColumnDefinition());
grid.ColumnDefinitions.Add(new ColumnDefinition());

grid.ShowGridLines = true;


by 피요히코~ 2009. 11. 24. 23:19

EX) 버튼에 margin을 준다면

XAML에서
<Button x:Name="btn_MyBtn" Width="100" Height="100" Margin="5,5,5,5"></Button>

 

CS에서
Thickness thickness = new Thickness();
thickness.Left = 5;
thickness.Top = 5;
thickness.Right = 5;
thickness.Bottom = 5;

btn_MyBtn.Margin = thickness;



XAML에서의 margin순서는
CS에서와 같이
좌 상 우 하
by 피요히코~ 2009. 11. 24. 22:59

MyRect.Fill = new SolidColorBrush(Colors.Blue);
by 피요히코~ 2009. 11. 24. 22:55

Windows7을 깔고

Live Writer를 테스트 하는게 이게 잘 써질런지…

지도 사진
by 피요히코~ 2009. 10. 26. 03:01
원하지 않는 메소드의 상속..

ex)
어떤 값을 저장하고 보여주는
ArrayList라는 클래스를 상속받아서
MyArrayList라는 클래스를 만들었음


 
public class MyLIst : ArrayList
{
     public void add(object obj)
     {
          base.Add(ojb);
     }
     public object pop(int index)
     {
          return base[index];
     }
}

근데 이걸 또 어떤 사람이 가져다 사용

근데 이걸 사용하다 보니
값을 없앨일이 생겨서
. 찍고 인텔리센스를 보니
clear() 메소드가 있음

그래서 사용하지만.
이건 사용자가 원하는데로 동작을 하지 않아요.

MyList에 있는 메소드가 아니라. ArrayList에서 상속받아진 메소드이기 때문에!
by 피요히코~ 2009. 10. 15. 10:13

abstratct class와 interface의 차이점을 말하기 전에 abstract class 와 interface는 무었인가..?
abstract clss는 보통 abstract 매소드를 가진 class 이며 객체를 생성 할 수 없다.
abstract method 는 또 뭐란 말이냐??

abstract method는
모두 virtual 매소드 이며 하위 클래스에서 상속을 받는다면 반드시 구현해 주어야 하는 매소드 이다.

virtual 매소드는??
기반형의 매소드가 아닌 현재형의 매소드가 호출될 수 있도록 하는 키워드..

그렇다면 이 둘의 차이는 무었일까.
abstract class는 생성자를 가질수 있다. 그러나 interface는 그럴수 없다.
abstract class는 abstract가 아닌 매소드를 가질수 있다. 그러나 interface는 그럴수 없다.
abstract class는 맴버 변수를 가질 수 있다 .그러나 interface는 그럴수 없다.
abstract class는 매소드의 접근자 모두를 가질수 있다. public, private, internal.. ect
그러나 iterface 는 public만 가질수 있다.
abstract class는 클래스 이므로 하나만 상속이 가능하나. interface는 다중 상속이 가능하다.

그럼 언제 이 둘을 사용하여야 하는가??
당연히.. is a 관게일땐 abstract class ,
다른 연관이 없는 class에서 기능을 사용하고 싶을 경우는 interface는 사용하는 것이 좋겠다.

[출처] C# 에서 abstract class와 interface의 차이점?|작성자 갑환
by 피요히코~ 2009. 10. 15. 09:54
| 1 2 3 4 5 6 ··· 12 |