位于另一个项目中的类由于其保护级别而无法访问



我收到错误CS0122类由于其保护级别而不可访问,该类位于另一个项目中。

嗯,我在同一个Net Core解决方案中有两个项目。为了简单起见,我称之为项目A和项目B,其中项目B需要引用属于项目A的几个类。

被引用的类TableProcess具有公共的类和所有方法。项目之间的引用是通过浏览/添加项目的dll来完成的。

这是位于项目A 中的TableProcess类

namespace ImageProducer.Repositories
{
public class TableProcessor
{
public TableProcessor(IJobTable jobTable)
{
_jobTable = jobTable;
}

public IJobTable _jobTable { get; set; }

public async Task CreateJobTableWithStatus(ILogger log, string jobId, string mode, string imageSource)
{
// The initial status "Uploaded"
EnumJobStatusCode status = EnumJobStatusCode.Queued;
log.LogInformation($"[+] Creating Job status. Job Id {jobId} - {status} - {JobStatusCode.GetStatus((int)status)}. Mode {mode}. Image Source {imageSource}");

// Initiate the JobTable
//JobTable jobTable = new JobTable(log, mode.ToString());

// Insert or replace record into the table.
await _jobTable.InsertOrReplaceJobEntity(jobId, (int)status, imageSource);

}

public async Task UpdateJobTableWithStatus(ILogger log, string jobId, int mode, int status, string statusDescription, string imageResult)
{
log.LogInformation($"[+] Updating Job status. Job Id {jobId} - {status} - {JobStatusCode.GetStatus(status)}");

// Initiate the JobTable
//JobTable jobTable = new JobTable(log, mode.ToString());
// Update record into the table.
await _jobTable.UpdateJobEntityStatus(jobId, (int)status, statusDescription, imageResult);

}

public async Task<JobEntity> RetrieveJobEntityByName(ILogger log, int mode, string name)
{
log.LogInformation($"[+] Retrieving JobStatus Record By Name, based on filter applied {mode} and Blob Name {name}");
// Initiate the JobTable
// JobTable jobTable = new JobTable(log, ConfigSettings.IMAGEJOBS_PARTITIONKEY);
// Update record into the table.
return await _jobTable.RetrieveJobEntityByName(mode.ToString(), name);
}
}
}

这些是项目B中引用类"表进程"的行,也是引发错误的行。

// This function will get triggered/executed when a new message is written 
// on an Azure Queue called queue.
public async Task ProcessQueueMessage([QueueTrigger("imagestoprocessqueue")] string message, TextWriter log)
{
try
{
QueueImageProcessMessage queueMessage = JsonConvert.DeserializeObject<QueueImageProcessMessage>(message);
// (#) Instatiate TableProcessor but inject JobTable object.
var tableProcessor = new TableProcessor(new JobTable(_logger, _configuration, queueMessage.imageConversionMode.ToString()));
// Create record job status with status Queued.
await tableProcessor.UpdateJobTableWithStatus(_logger, queueMessage.fileName, queueMessage.imageConversionMode, (int)EnumJobStatusCode.Running,null, null);
}
catch (Exception ex)
{
Console.WriteLine("Log a error here.", ex.Message);
}
}

如果我将类移到项目B,则不会发生错误。这个解决方案很奇怪,在同一个解决方案中的两个项目中保持相同的类文件。

你可以在下面找到对项目A中类的两个引用。

using ImageProducer.Repositories;
using ImageProducer.DataTransferObjects;

DataTransferObejcs中的类都很好,存储库中的类JobTable也很好,但特别是存储库中这个TableProcessor类让我头疼。

任何帮助,我真的很感激,我是c#netcore的初学者。

您应该引用项目而不是dll。原因是与项目相比,dll可能已经过期,因此您希望访问的类或方法在该版本中可能不是公共的,或者不存在。通过引用该项目,您可以确保Visual studio将构建该项目,并且生成的dll将是最新的,符合您的期望。

如果这给你带来了问题(正如你所说的黄线(,那么你的目标框架很可能是不同的。例如,项目A是.Net 4.x项目,项目b是.Net Standard 2.0,或者A是.Net 4.7,b是.Net 4.0,或者类似的东西。

不能引用针对较新框架的dll。引用.Net 4.6+中的.Net Standard dll(或更早版本,不确定(是可以的,因为.Net Standard就是这样工作的。

因此,请检查您的目标框架,尽可能使它们兼容,并引用项目而不是dll。

我认为您的问题是引用了dll,而不是项目。dll的引用版本可能没有您需要的类。

最新更新