我有一个webdriver解决方案,里面有10个左右的项目。 1个核心程序集/ dll,包含所有常用方法和9个其他测试程序集,在其测试中使用这些方法。
我需要为这9个程序集中的一个访问嵌入式资源,但我需要从核心dll中进行。什么是最好的方法。
namespace = webdriver.core
json.cs - reads a json file and returns it as a string
namespace = webdriver.marketplacestest
marketplace1Test.cs - calls one of the methods in json.cs such as getName();
profile.json - holds {"marketplace1" : "Amazon"}
从已知的命名空间调用嵌入式资源很容易。我是这样做的:
private static string fromEmbeddedResource(string myNamespace, string myFolder, string fileName)
{
string result;
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(myNamespace + "." + myFolder + "." + fileName))
using (StreamReader reader = new StreamReader(stream))
{
result = reader.ReadToEnd();
}
return result;
}
如您所见,我只是调用以下内容,我将文件作为字符串
string json = fromEmbeddedResource("WebDriver.Core", "CFG", "pid.json");
当文件嵌入我的一个测试dll时,它会更难。任何人都知道如何访问或获取程序集的命名空间?我试过......
Assembly.GetCallingAssembly().GetTypes();
但看起来它正在从WebDriver.Core.dll程序集中提取类型而不是WebDriver.Marketplace1.dll程序集。
答案 0 :(得分:0)
我能够弄清楚。我遇到的问题是调用程序集不是正确的程序集,因为我在我的核心dll中调用了一个方法,在我的核心dll中调用了另一个方法。我通过传递装配工作,但这很昂贵。为了提高效率,我修改了我的静态SettingsRepository类,它将两个程序集保存在字典中。这样我就可以传入一串“核心”或“测试”并拉动程序集,而无需确定每次都使用正在执行的程序集或调用程序集。
private static Dictionary<string, object> _assembly = new Dictionary<string,object>();
public static Assembly getAssembly (string type)
{
return _assembly[type] as Assembly;
}
public static void addAssembly(string myType, Assembly assembly)
{
bool containsKey = _assembly.ContainsKey(myType);
if (!containsKey)
{
_assembly.Add(myType, assembly);
}
}
当我开始测试时,我总是首先初始化我的驱动程序类,所以我将以下两个集添加到该构造函数中。
Settings.addAssembly("core", Assembly.GetExecutingAssembly());
Settings.addAssembly("test", Assembly.GetCallingAssembly());
现在,我可以随时调用我想要的任何程序集,并知道我正在使用哪一个。