본문 바로가기

Silverlight

동적으로 xap 파일 읽어 추가하기(2)

이럴쑤가~ 이렇게 이쁘게 붙여넣는 방법이 있었군요!!

Load Dll from xap

 

        void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

        {

            StreamResourceInfo xapSri = new StreamResourceInfo(e.Result, null);

            StreamResourceInfo manifestSri = Application.GetResourceStream(xapSri, new Uri("AppManifest.xaml", UriKind.Relative));

            using (XmlReader xmlReader = XmlReader.Create(manifestSri.Stream))

            {

                //xml을 읽을 노드가 없을때까지 읽기

                while (xmlReader.Read() == true)

                {

                    //읽혀진 노드가 AssemblyPart로 시작 한다면

                    if (xmlReader.IsStartElement("AssemblyPart") == true)

                    {

                        //속성중에 Source를 읽어다가 source에다가 저장

                        string source = xmlReader.GetAttribute("Source");

                        //어셈블리 사전에 등록

                        _dicAssemblies.Add(source,LoadAssembly(xapSri, source));

                    }

                }

                //일단 IamXap안에 있는 MyControl을 읽기위한 함수(테스트용)

                LoadMyControl("IamXap.dll");

            }

        }

 

        /// <summary>

        /// MyControl 읽기

        /// </summary>

        /// <param name="dllName"></param>

        private void LoadMyControl(string dllName)

        {

            //Dll 에서 MyControl을 찾아다가 인스턴스로 만듬(이부분은 제가 미리 만들어 놓은 MyControl 이라는 UserControl 을 읽어 오는 과정 입니다.

            UIElement myContorl = (_dicAssemblies[dllName] as Assembly).CreateInstance("IamXap.MyControl") as UIElement;

            //LayoutRoot에 추가

            LayoutRoot.Children.Add(myContorl);

        }

 

        /// <summary>

        /// 어셈블리 읽기

        /// </summary>

        /// <param name="xapSri"></param>

        /// <param name="source"></param>

        /// <returns></returns>

        private Assembly LoadAssembly(StreamResourceInfo xapSri, string source)

        {

            //xapSri을 통해서 읽은 dll

            StreamResourceInfo sourceInfo = Application.GetResourceStream(xapSri, new Uri(source, UriKind.Relative));

            AssemblyPart assemblyPart = new AssemblyPart();

            //dll load

            return assemblyPart.Load(sourceInfo.Stream);

        }


짜잔~ 이렇게 하면 되네용