using System.Windows.Forms; using System.ComponentModel; using System.ComponentModel.Design; [Designer("System.Windows.Forms.Design.ParentControlDesigner,System.Design", typeof(IDesigner))] public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } }
[Designer("System.Windows.Forms.Design.ParentControlDesigner,System.Design", typeof(IDesigner))]
이 Attribute를 이용하면 끝.
IHttpModule을 이용하여 공통 처리하는 것이 좋겠지만
웹 서비스의 경우에는 Exception을 "html/xml"으로 변경 처리하기 때문에
여기의 Error에서 Exception을 확인할 수 없습니다.
public class ExceptionManager : IHttpModule { public void Init(HttpApplication webApp) { webApp.Error += new EventHandler(webApp_Error); } protected void webApp_Error(object sender, EventArgs eventArgs) { HttpApplication webApp = (HttpApplication)sender; Exception e = webApp.Server.GetLastError().GetBaseException(); // 예외 처리 } public void Dispose() { } }
그래서 SoapExtension을 확장하여 Exception 공통 처리를 하도록 변경하여야 합니다.
public class ExceptionExtension : SoapExtension { public override object GetInitializer(Type serviceType) { return null; } public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return null; } public override void Initialize(object initializer) { } public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: SoapException ex = message.Exception as SoapException; if (ex != null) { // 예외 처리 } break; } } }
SoapExtension을 상속받아 추상화 부분을 작성하면 됩니다.
그 중 ProcessMessage의 message.Stage가 SoapMessageStage.BeforeSerialize이거나
SoapMessageStage.AfterSerialize이면 웹 서비스에서 발생한 Exception을 확인할 수 있습니다.
두 가지 중 BeforeSerialize을 이용한 것은 이곳에서는 Exception을 변경하여도 되지만
AfterSerialize에서는 Exception을 변경하면 안되기 때문입니다.
HttpModule의 등록장소는 Web.Config 파일의 다음과 같지만
<configuration> <system.web> <httpModules> <add name="ExceptionManager" type="Darkin.ExceptionManager, Darkin" /> </<httpModules> </system.web> <!-- IIS 7.0 <system.webServer> <modules> <add name="ExceptionManager" type="Darkin.ExceptionManager, Darkin" /> </modules> </system.webServer> --> </configuration>
SoapExtension의 경우에는 다음과 같습니다.
<configuration> <system.web> <webServices> <soapExtensionTypes> <add type="Darkin.ExceptionExtension, Darkin" priority="1" group="High" /> </soapExtensionTypes> </webServices> </system.web> </configuration>
오류 1731 : Microsoft Office Shared MUI 문제라고 떠들어 댑니다.
맞는 버전으로 설치하라고 하네요.
문제는 설치하다 오류가 난적이 있거나 하면 문제가 되는 거 같습니다.
저의 원인은 레지스트리에 설치했던 정보가 남아 있어서 그런 거 같습니다.
그래서 regedit 에서 다음 문자가 들어간 부분을 다 제거하고
C:\Windows\Installer에서 해당 폴더를 제거한 뒤에 다시 설치하면 정상설치 되었습니다.
저의 해당 문자열입니다.
{90120000-006E-0412-0000-0000000FF1CE}
이것은 설치하려는 CD내에 Office.ko-kr 폴더내의 OfficeMUI.xml 문서를 열면
ProductCode="{90120000-006E-0412-0000-0000000FF1CE}"
이렇게 존재합니다. 이 부분을 모두 찾아 제거를 해준 것입니다.
다른 분들도 해결 되면 좋겠네요.
이 이벤트 발생시 전달하는 클래스를 제너릭으로 만들면 동작은 잘 되지만
이벤트 생성 처리시에 문제가 있다.
여기서의 생성 처리시 문제란 VS가 자동으로 생성해 주는 경우이다.
void textBox1_TextChanged(object sender) { }
원래는 이렇게 생성 되어야 한다.
물론 위의 것을 아래로 수정해도 된다.
void textBox1_TextChanged(object sender, DChangeEventArgs<String> e) { }
이 문제의 해결은 제너릭으로 만들어 진 것을 다시 상속받아 제너릭이 아니게 만들면 된다.
class DTextChangeEventArgs : DChangeEventArgs<String> { public DTextChangeEventArgs(String oldValue, String newValue) : base(oldValue, newValue) { } }
물론 EventHandler<T> 도 문제가 있으므로
이것은 직접 delegate를 이용한 EventHandler를 만들어 이용하도록 하자.
//public event EventHandler<DTextChangeEventArgs> TextChanged; public delegate void DTextChangeEventHandler(object sender, DTextChangeEventArgs e); public event DTextChangeEventHandler TextChanged;