C# 对象引用未设置为对象的实例。当通过网络访问但在本地工作正常时
我有一个我似乎无法解决的问题,我正在旋转我的轮子…我有一个作为一个整体构建的项目(C#多线程windows应用程序),我的任务是分解各个组件以打破相互依赖。现在所有的组件都被分解了,我正在测试和调试我提出的问题,然后再将其发布给QA。这是(希望)最后一期: 当我运行主组件时,它接受了一个要处理的任务,它实例化了运行时组件(.DLL),而运行时组件又实例化了一个程序集(data acquisition.DLL)。程序集(data acquisition.DLL)是围绕控制其功能的基本组件构建的。程序集被编译并存储在网络上,并从网络上访问,因为网络上的不同机器上运行着主组件的多个实例。当我试图访问其“目录”中的程序集时,我得到一个“对象引用未设置为对象的实例”。…但是…当我运行本地复制的相同程序集时,它运行正常 我不明白为什么它在本地运行,而不是在网络上运行。我想不出我丢失的参考资料在哪里…请帮忙 希望我已经对这个问题进行了足够详细的描述,可以提供一些指导,如果您需要更多详细信息,请告诉我 编辑:包括代码片段和日志文件片段 以下是发生问题的代码部分:C# 对象引用未设置为对象的实例。当通过网络访问但在本地工作正常时,c#,multithreading,dll,nullreferenceexception,C#,Multithreading,Dll,Nullreferenceexception,我有一个我似乎无法解决的问题,我正在旋转我的轮子…我有一个作为一个整体构建的项目(C#多线程windows应用程序),我的任务是分解各个组件以打破相互依赖。现在所有的组件都被分解了,我正在测试和调试我提出的问题,然后再将其发布给QA。这是(希望)最后一期: 当我运行主组件时,它接受了一个要处理的任务,它实例化了运行时组件(.DLL),而运行时组件又实例化了一个程序集(data acquisition.DLL)。程序集(data acquisition.DLL)是围绕控制其功能的基本组件构建的。程
string assemblyName = moduleName;
_log.LogMessage("DACLRuntime assemblyName: " + assemblyName);
Assembly dacAssembly = Assembly.LoadFrom(assemblyName);
moduleName = Path.GetFileNameWithoutExtension(assemblyName);
_log.LogMessage("DACLRuntime moduleName: " + moduleName);
var dacType = (from c in dacAssembly.GetTypes() where c.Name.EqualsIgnoreCase(moduleName) select c).First();
_log.LogMessage("DACLRuntime dacType: " + dacType.ToString());
if (dacType != null)
{
_log.LogMessage("DACLRuntime Instansiate the DACBase...");
DACBase dac = (DACBase)Activator.CreateInstance(dacType);
_log.LogMessage("DACLRuntime DACBase is instantiated...");
dac.gsDACLPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
_log.LogMessage("DACBase path is: " + dac.gsDACLPath);
try
{
// -- Does the script exist...
if (File.Exists(assemblyName))
_log.LogMessage("Script located at ==> " + assemblyName + " <== Exists.");
_log.LogMessage("Script Started:" + assemblyName + " orderid:" + orderId);
dac.iPid = iPid;
_log.LogMessage(" dac.iPid = " + iPid.ToString());
_log.LogMessage(" Calling dac.InitAndExecute()...Passing the OrderId and the RunTime Log file (_log)...");
dac.InitAndExecute(orderId, _log);
_log.LogMessage(" Call to dac.InitAndExecute() sucessful...");
}
catch (IndexOutOfRangeException)
{
// Coded As per ZAM to raise error 17 if it is index out of bounds
dac.Frame.Error = 17;
_log.LogInformation("Index was outside the bounds of the array For " + assemblyName + " orderid:" + orderId);
}
解决了我的问题
我从使用Assembly.LoadFrom()切换到将完全限定路径传递到Assembly.Load()并传递dll的bite数组
_log.LogMessage("DACLRuntime assemblyName: " + assemblyName);
//Assembly dacsembly=Assembly.LoadFrom(assemblyName)
在回答以下问题时偶然发现了这一点:请显示您的代码。在调试器中运行不会显示“对象引用未设置为对象实例”错误发生的位置吗?请显示引发异常的代码部分。我们不是千里眼。几乎所有的
NullReferenceException
案例都是一样的。请参阅“”以获得一些提示。不幸的是,我没有足够的声誉投票支持从transistor1得到的关于另一个问题的答案。只是想说声谢谢!!!
protected virtual void Initialize()
{
// - - - Initialize Logging for the application - - -
if (_log == null)
{
_log = new Logger("DACLRuntime.Log", 7);
_log.LogMessage("DACLRuntime Logging being used...");
}
_log.LogMessage("DACLBase Initializing..." + DateTime.Now.ToString());
// -- Initialize the sub-components...
_log.LogMessage(" CommonFunctions (CF) Initializing...");
if (CF == null) CF = new CommonFunctions(this);
_log.LogMessage(" CommonRoutiness (CR) Initializing...");
if (CR == null) CR = new CommonRoutines(this);
_log.LogMessage(" DACFrame (Frame) Initializing...");
if (Frame == null) Frame = new DACFrame();
_log.LogMessage(" DBExtn (FSHDB) Initializing...");
if (FSDBH == null) FSDBH = new DBExtn();
// -- Log the DB initialization...
_log.LogMessage("DACL Database (FSDBH) Connected: " + FSDBH.ADOConnect("FS2000").ToString());
_log.LogMessage("[DEBUGGING] ::: DACLBase :: Initialize : ZDVR Set as:" + gsDACLPath);
}
protected abstract void Main(params object[] parameters);
public void InitAndExecute(params object[] args)
{
// -- Debugging...
if (args != null && args.Length > 0)
{
_log = (Logger)args[1];
_log.LogMessage("DACLRuntime Logging Passed in...");
_log.LogMessage(_log.CurrentLogFile);
}
_log.LogMessage("Calling the Initialize()...");
Initialize();
_log.LogMessage("[DEBUGGING] ::: DACLBase :: InitAndExecute : Setting the OrderId...");
if (args != null && args.Length > 0)
if (args[0].ToString().Trim().Length == 12)
OrderId = args[0].ToString();
// -- Debugging...
_log.LogMessage("[DEBUGGING] ::: DACLBase :: InitAndExecute : Entering Script...");
Main(args);
}
_log.LogMessage("DACLRuntime assemblyName: " + assemblyName);
string sAssFile = assemblyName;
byte[] AssmBytes = File.ReadAllBytes(sAssFile);
Assembly dacAssembly = Assembly.Load(AssmBytes);
moduleName = Path.GetFileNameWithoutExtension(assemblyName);