我希望有人能帮忙解决这个问题,我搜索过,似乎无法找到答案,甚至找不到同样的问题。
我正在从文件加载程序集(即使我有v2 Powershell add-type在这个实例中有一些奇怪的行为)。
[System.Reflection.Assembly]::LoadFrom("$env:userprogile\path\to\my\dll\mydll.dll")
$taskId = 1
$ts = New-Object mydll.myclass -ArgumentList @(,$taskId)
DLL加载正常,构造函数按预期变得可用,但在尝试将参数解析为它时,实际上只需要一个,在这种情况下它会抛出此错误
New-Object : Exception calling ".ctor" with "1" argument(s): "Index 1 is out of range."
At line:1 char:7
+ $ts = New-Object mydll.myclass
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
当传递1的整数时,单元测试和测试app的工作正常。
$taskId -is [int]
给出了真实,我尝试通过以下方式传递:
-ArgumentList 1
-ArgumentList (1)
-ArgumentList @(1)
,我相信还有其他更荒谬的事情
有趣的是,所有人都犯了同样的错误......
构造函数签名:
public sealed class myclass: IDisposable
{
private readonly int _taskId = 0;
private ScheduledTask scheduledTask = null;
public myclass(int taskId)
{
if (taskId == 0)
throw new ApplicationException("Task Id is not valid");
_taskId = taskId;
scheduledTask = TaskJobFactory.CreateScheduledTask(this._taskId);
}
public void RunTask()
{
DataTable dt = null;
String csvString = String.Empty;
try
{
dt = TaskJobFactory.CreateTableTask(scheduledTask.EnumTaskType, scheduledTask.campaignID.Value);
csvString = Csv.DataTableToCsc(dt);
if (csvString.Length > 0)
{
SmtpManager.SendEmailStatic(csvString, scheduledTask.Id, scheduledTask);
TaskHistoryFactory.UpdateTaskHistory(this._taskId, (int)ScheduledTaskStatus.Success, "Success");
}
else
TaskHistoryFactory.UpdateTaskHistory(this._taskId, (int)ScheduledTaskStatus.Unknown, String.Format("No Data for that Taks id {0}", _taskId));
}
catch (Exception ex)
{
TaskHistoryFactory.UpdateTaskHistory(this._taskId, (int)ScheduledTaskStatus.Failure, "Fail");
ErorrLoggingFacede.LogError(ex, "TaskRunner", "RunTask");
throw ex;
}
finally
{
dt = null;
}
}
}
抱歉格式化......
另外,我尝试使用一个空的构造函数并将args直接传递给方法,它在测试应用程序中工作(有一些错误,因为它不是为此而构建的,但实际上已完成)