c#同样的代码适用于应用程序,但不适用于.dll

问题描述:

我真的很困惑我已经写了一些从数据库中读取某些记录的代码。如果我将它编译为应用程序,它工作正常。如果我将它编译为.dll并从另一个应用程序调用.dll,则代码不再有效(它将返回全零)。 此代码是所谓的Form_onShown()c#同样的代码适用于应用程序,但不适用于.dll

Portfolios.Add(new NPortfolio(1, "1", activeContracts)); 
Dictionary<string, double> p = db.GetPortfolio(1,Today); 
Portfolios[0].UpdatePositions(p); 

var strContracts = new List<string>();      
strContracts.Add(pf.p_id); 
strContracts.AddRange(pf.getPositions().Select(o => o.Value.ToString()).ToList()); 

时为.exe文件编译该回到我的存储数据库中的值,返回时为.dll文件编译所有0!

的NPortfolio类被定义为如下:

public NPortfolio(int nr, string id, List<string> ac) 
    { 
     p_nr = nr; 
     p_id = id; 
     positions = new Dictionary<string, double>(); 
     foreach (string ticker in ac) 
     { 
      positions.Add(ticker, 0.00); 
     } 
    } 

    public void UpdatePositions(Dictionary<string, double> position) 
    { 
     foreach (var k in this.getPositions().Keys.ToList()) 
     { 
      if (position.ContainsKey(k)) 
      { 
       this.positions[k] = position[k]; 
      } 
     } 
    } 

    public Dictionary<string, double> getPositions() 
    { 
     return positions; 
    } 
} 

任何建议?

R.

+1

你是否运行了调试器并逐步完成了这些方法? –

+0

我不知道如何调试.dll,调用的应用程序在没有IDE的其他机器上运行 – prre72

+1

您可以创建一个新项目,引用该dll并粘贴到您要测试的代码中。然后用调试器运行它。这或多或少是你在这里问人的。 – Dietz

此代码应运行的.dll和.exe相同。

很有可能,因为你的2个环境设置不同,这是你的问题,并且在那里,最有可能是数据库提供输入或连接数据存储。 (您没有显示的代码。)

您是如何确定您发布的代码确实失败的?

你可以试试:

  • 执行对有故障的机器
  • 工作的.exe未能获得.exe文件到机器,你可以调试(你可以启动DLL - 如果你这样做,它会问你您想要启动哪个.exe进行调试,或者您可以将其设置为项目属性)
  • 插入日志记录,可能会失败并在发生故障的计算机上执行的每个步骤。从数据库连接开始,接收多少条记录,依此类推。除非您在早期发现问题,否则这会变得非常乏味。
+0

很平坦..我试图在失败的机器上运行.exe,我得到以下消息:“AppName已停止工作, - 在线检查... - 关闭程序, - 调试程序 – prre72

+0

这并不说明很多..内部出了问题,可能是一些未处理的异常。你可以添加你自己的处理程序的未处理的异常http://stackoverflow.com/questions/3133199/net-global-exception-handler-in-console-application然后日志它/显示一个盒子/任何东西,它应该给你关于出错的信息(使用ex.ToString(),它包括Stacktrace和消息,这通常是非常有用的。) –