2

同じソリューションでいくつかのダイアログ フォームをあるクラス ライブラリから別のクラス ライブラリに移動 (ドラッグ アンド ドロップ) しました (どちらも 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" コードを完全に削除しました。

この問題はまだ私のケースに固有のものだと思いますが、誰かがこれを役に立つと思うかもしれません.

ありがとう。

4

2 に答える 2

1

私は同じ問題に遭遇したので、

私は問題を見つけました(誰かがこれについて疑問に思っている場合):

あなたの解決イベントの最後の行は次のとおりです。

MyAssembly = Assembly.LoadFrom(strTempAssmbPath);

ただし、正しいアセンブリが見つからなかった場合strTempAssmbPath=""<- 空の文字列。

したがって、例外

これは、参照を追加したが型を使用しなかった場合にも発生します (型は にロードされませんobjExecutingAssemblies.GetReferencedAssemblies();) 。

于 2016-04-27T17:20:46.570 に答える
1

同じ問題を抱えていたことを覚えています。また、から継承されたクラスにも関係がありImageます。

問題の原因は覚えていませんが、処理されなかった内部例外が原因だったことは覚えています。
元の例外は関連していないString cannot have zero length.ため、このメッセージは誤解を招く可能性があります。

次のことを試してください。

  1. すべての初回例外のキャッチを有効にします (こちらの回答で手順を見つけることができます)
  2. アプリケーションをデバッグします。
  3. 最初のチャンスの例外がないことを確認します (これが不可能な場合は、それらをキャッチして処理するようにしてください)
  4. 未処理の例外がなくなったら、アプリケーションを再度デバッグします。
  5. それでもエラーが発生しますか?

この問題の原因が何であったかを思い出すために、周りを見てみます。上記が役に立った場合は、原因についての洞察を共有してください。

于 2013-09-15T05:59:22.773 に答える