Inquiridor
Problema com o formulário herdado

Pergunta
-
Bom dia pessoal!
Tenho a seguinte situação problema, tenho uma solution onde existem vários projetos, sendo 1 projeto com formularios base e os demais projetos herdam desse formulário (inherit forms),
diversas vezes e de modo intermitente os formulários herdados não carregam no modo design gerando um erro de serialization ou could not load assembly file, todavia todas as referencias
e arquivos estão presentes e bem apontados.
Hora funciona normalmente hora não sem nenhuma explicação. A maneira que herdo os formulários é via DLL e não via solution, todas as dlls estão na pasta debug\build.
Ja fiz inumeras tentativas de trocar referencia, pastas, separar os projetos, etc, porém inexplicavelmente o problema ocorre.
Alguém tem alguma solução ou idéia do que possa ser este problema?
Aguardo
Todas as Respostas
-
Qual a descrição do erro?
Thiago Coelho - Líder das Comunidades .NET Coders e Windows 8 Brasil
thiagocoelho.net | @thiagokoelho -
o erro ocorre quando eu abro o formulário em formato de design ele não fica no Erro List. Segue abaixo, um dos erros:
To prevent possible data loss before loading the designer, the following errors must be resolved:
Could not load file or assembly 'FormulaCerta.Commons.BLL, Version=1.0.0.16911, Culture=neutral, PublicKeyToken=null' or one of its dependencies. O sistema não pode encontrar o arquivo especificado.
Instances of this error (1) 1. Hide Call Stack at FormulaCerta.Base.Forms.FormBaseFormulaCerta.FormBaseFormulaCerta_Load(Object sender, EventArgs e)
at System.EventHandler.Invoke(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at DevExpress.XtraEditors.XtraForm.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.set_Visible(Boolean value)
at System.Windows.Forms.Design.DesignerFrame.Initialize(Control view)
at System.Windows.Forms.Design.DocumentDesigner.Initialize(IComponent component)
at System.Windows.Forms.Design.FormDocumentDesigner.Initialize(IComponent component)
at System.ComponentModel.Design.DesignerHost.AddToContainerPostProcess(IComponent component, String name, IContainer containerToAddTo)
at System.ComponentModel.Design.DesignerHost.PerformAdd(IComponent component, String name)
at System.ComponentModel.Design.DesignerHost.System.ComponentModel.Design.IDesignerHost.CreateComponent(Type componentType, String name)
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer)
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.System.ComponentModel.Design.Serialization.IDesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer)
at System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload) -
Meu pitaco: mesmo que um formulário esteja em design, os código dentro do evento/metodo OnLoad são executados. Considere o seguinte cenário:
public partial class FormularioPai : Form { protected override void OnLoad(EventArgs e) { base.OnLoad(e); //algum código que deveria rodar só em runtime. } }
e
public partial class FormularioFilho : FormularioPai
Quando você abre o FormularioFilho no designer (dentro do Visual Studio) o código dentro do OnLoad() do FormularioPai é executado. Aqui os erros podem acontecer, pois o código em questão pode necessitar de alguma dependência não carregada em tempo de design. Uma solução para isso seria identificar que o Form está em design time e não executar um trecho de código:
public partial class FormularioPai : Form { protected override void OnLoad(EventArgs e) { base.OnLoad(e); //verifica se o processo em execução é o Visual Studio. if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") { //algum código que rodará só em runtime. } } }
Esse é só um método para verificar se está executando em design time. Uma pesquisa rápida na net vai te trazer outras opções se essa não for adquada.
-