同じソリューションでいくつかのダイアログ フォームをあるクラス ライブラリから別のクラス ライブラリに移動 (ドラッグ アンド ドロップ) しました (どちらも C# クラス ライブラリです)。次に、実行時に、次のような行で、そのターゲット dll の移動された以前に存在したフォームのInitializeComponent
メソッド内でエラーが発生し始めました。myform.Designer.cs
this.pictureBox1.Image = global::mydll.Properties.Resources.Webster;
例外は次のとおりです。
文字列の長さをゼロにすることはできません。
フォームが最初は正しく読み込まれることがありますが、その後は正しく読み込まれません。
あるプロジェクトから別のプロジェクトにフォームを移動する際に問題が発生したことはありますか?
ターゲットの dll 名前空間を使用するように、すべての名前空間を更新しました。
-- イベント ビューアから
Message: String cannot have zero length.
Source: mscorlib
TraceStack: at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark)
at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark)
at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture)
at Common.Properties.Resources.get_License() in E:\WORK\ProjectOne\Common\Properties\Resources.Designer.cs:line 146
at Project.ONE.Common.ProgressDialog.InitializeComponent() in E:\WORK\ProjectOne\Common\ProgressDialog.Designer.cs:line 100
at Project.ONE.Common.ProgressDialog..ctor(String caption) in E:\WORK\ProjectOne\Common\ProgressDialog.cs:line 60
at Start.CSCom.start() in E:\WORK\ProjectOne\Addin\CSCom.cs:line 326
at Start.Connect.ButtonStartClicked(IRibbonControl control) in E:\WORK\ProjectOne\Addin\Connect.cs:line 464.
-- 解決済み
Avi の指示に従って、「First Chance Exception」を有効にし、以下の Assembly Resolve コードで問題を発見しました (明らかに、これはアセンブリを読み込もうとして失敗しています)。
currentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve);
.. .. ..
Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args){
//This handler is called only when the common language runtime tries to bind to the assembly and fails.
//Retrieve the list of referenced assemblies in an array of AssemblyName.
Assembly MyAssembly, objExecutingAssemblies;
string strTempAssmbPath = "";
objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
//Loop through the array of referenced assembly names.
foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
{
//Check for the assembly names that have raised the "AssemblyResolve" event.
if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
{
//Build the path of the assembly from where it has to be loaded.
//The following line is probably the only line of code in this method you may need to modify:
RegistryKey regkey = Registry.LocalMachine.OpenSubKey(@"Software\ProjectONE\addin");
strTempAssmbPath = regkey.GetValue("DllLocation").ToString();
if (strTempAssmbPath.EndsWith("\\")) strTempAssmbPath += "\\";
strTempAssmbPath += args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
break;
}
}
//Load the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
//Return the loaded assembly.
return MyAssembly;
}
フォームをあるクラス ライブラリから別のクラス ライブラリに移動する目的は、ソリューション dll の数を減らすことであるため、"Assembly Resolve" コードを完全に削除しました。
この問題はまだ私のケースに固有のものだと思いますが、誰かがこれを役に立つと思うかもしれません.
ありがとう。