使用不工作的接口C#连接dll中的异常

时间:2014-03-04 09:26:14

标签: c# dll interface exception-handling epplus

我的解决方案中有3个项目。

A:主程序,使用界面调用插件。

Plugin plugin = Plugin.GetPluginByName("FILE_ANALYZER");
if (plugin != null)
{
    try // show preview of data inside this file using plugin
    {
        plugin.Interface.Run(forThisFile);
        labelResultInfo.Text = plugin.Interface.ResultText;
    }
    catch // (Exception mainEx)
    {
        error = true;
    }
}

B:带插件接口的DLL +所有可以插件用于工作的“通用”方法。此类使用epplus dll中的方法。

public bool LoadFile()
{
    if (!this.FileInfoInitialized.Exists) { return false; }
    try
    {   // load new excel package from existed file
        this.Package = new ExcelPackage(this.FileInfo); // using epplus
        return true;
    }
    catch { return false; }
}

C:我的插件DLL,实现B中定义的接口并调用B方法

public bool Run(string fileToAnalyze = "")
{
    var rep = ExcelReport(fileToAnalyze);
    if (rep.LoadFile())
    {
        ResultText = "Correct XLSX file";
        return true;
    }
    else
    {
        ResultText = "Incorrect file, but you can continue without error";
        return false;
    }
}

现在,我可以加载插件而不会出现任何错误,我也可以从程序 A 中调用plugin.Interface.Run(forThisFile);。如果我发送的文件不正确,我希望程序声明格式不正确但允许我继续而不会出错。 但不是。程序按以下顺序执行步骤:

1. plugin.Interface.Run(forThisFile); // A // is called with "Not_excel_file.txt"
2. var rep = ExcelReport(fileToAnalyze); // C // is initialized
3. rep.LoadFile() ==> LoadFile() // C ==> B // method from DLL B is called
4. this.Package = new ExcelPackage(this.FileInfo); // B // throw an Exception
   >> epplus: File contains corrupted data.
5. catch from LoadFile() return false; // B // exception is catched inside B and return false to C
6. ResultText = "Incorrect file, but you can continue without error"; // C // "if (rep.LoadFile())" in C evaluate "false result" correct way
7. return false; // C ==> A // and return false to main program
8. // And this step is problem
   // Now, after return false from C, debugger stay on row in main program A:
   error = true;
   // And this row was skipped and never called:
   labelResultInfo.Text = plugin.Interface.ResultText;
   // If I enable catch mainEx, then this Exception is:
   >> Object reference not set to an instance of an object.
   // In output window I get this after step 5:
   >> A first chance exception of type 'System.IO.FileFormatException' occurred in WindowsBase.dll
   >> A first chance exception of type 'System.IO.FileFormatException' occurred in EPPlus.dll
   // And this message in actual step:
   >> A first chance exception of type 'System.NullReferenceException' occurred in MyInterfaceDLL_B.dll

(注意:这是修改后的代码,我的界面更复杂,但错误就是这样表现出来的)

有人能说出原因吗? 如何在dll中捕获异常而不是将其抛入主程序?
我知道我只能在此行中遇到 A 错误:plugin.Interface.Run(forThisFile);然后在标签中初始化文字,但为什么这不起作用?

我根据您的问题尝试了什么?

  • 您可以在此行labelResultInfo.Text = plugin.Interface.ResultText;中找到空引用吗?

我已启用所有公共语言运行时例外并修改 A 以显示plugin.Interface.ResultText内的内容。 A

中的捕获新代码
catch // (Exception mainEx)
{
    error = true;
    labelResultInfo.Text = plugin.Interface.ResultText;
}

运行后:

  1. WindowsBase.dll中出现'System.IO.FileFormatException'类型的第一次机会异常 附加信息:文件包含损坏的数据。 如果存在此异常的处理程序,则可以安全地继续该程序。
  2. EPPlus.dll中出现'System.IO.FileFormatException'类型的第一次机会异常 附加信息:文件包含损坏的数据。 如果存在此异常的处理程序,则可以安全地继续该程序。
  3. MyInterfaceDLL_B.dll中出现'System.NullReferenceException'类型的第一次机会异常 附加信息:未将对象引用设置为对象的实例。
  4. 搜索代码后。 >>这是包装的一部分,在尝试使用不正确的文件后关闭。所以我修改了dispose:if (this.Package != null) this.Package.Dispose();现在所有异常都被正确捕获。

    感谢您的帮助。

0 个答案:

没有答案