我正在寻找一种通过执行以下步骤来运行代码的方法:
到目前为止,我正在努力迈出第三步。我无法在运行时找到如何加载我的包。
我的主要问题是:
感谢您的帮助。
代码示例#1:
private static void getPackageByNameAndVersion(string packageID, string version)
{
IPackageRepository repo =
PackageRepositoryFactory.Default
.CreateRepository("https://packages.nuget.org/api/v2");
string path = "C:/tmp_repo";
PackageManager packageManager = new PackageManager(repo, path);
Console.WriteLine("before dl pkg");
packageManager.InstallPackage(packageID, SemanticVersion.Parse(version));
}
代码示例#2:
private static void loadByAssemblyNameAndTypeName(string assemblyName, string typeName)
{
AppDomain isolationAppDomain = AppDomain.CreateDomain("tmp");
object a = isolationAppDomain.CreateInstanceAndUnwrap(assemblyName, typeName);
Type x = a.GetType();
MethodInfo m = x.GetMethod("Main");
m.Invoke(a, new object[] { });
}
答案 0 :(得分:17)
Nuget.Core(nuget包)是一个不错的选择,这里有一段代码,我应该可以通过id
和version
下载一个nuget包
var repo = PackageRepositoryFactory.Default
.CreateRepository("https://packages.nuget.org/api/v2");
string path = "c:\\temp";
var packageManager = new PackageManager(repo, path);
packageManager.PackageInstalled += PackageManager_PackageInstalled;
var package = repo.FindPackage("packageName", SemanticVersion.Parse("1.0.0"));
if (package != null)
{
packageManager.InstallPackage(package, false, true);
}
请注意,我将事件处理程序插入
PackageInstalled
类的PackageManager
事件。
由于反射API不提供在特定域中加载程序集的方法,我们将创建一个代理类,在我们的隔离域中充当加载器:
public class TypeProxy : MarshalByRefObject
{
public Type LoadFromAssembly(string assemblyPath, string typeName)
{
try
{
var asm = Assembly.LoadFile(assemblyPath);
return asm.GetType(typeName);
}
catch (Exception) { return null; }
}
}
复杂的部分来了:
private static void PackageManager_PackageInstalled(object sender,
PackageOperationEventArgs e)
{
var files = e.FileSystem.GetFiles(e.InstallPath, "*.dll", true);
foreach (var file in files)
{
try
{
AppDomain domain = AppDomain.CreateDomain("tmp");
Type typeProxyType = typeof(TypeProxy);
var typeProxyInstance = (TypeProxy)domain.CreateInstanceAndUnwrap(
typeProxyType.Assembly.FullName,
typeProxyType.FullName);
var type = typeProxyInstance.LoadFromAssembly(file, "<KnownTypeName>");
object instance =
domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
}
catch (Exception ex)
{
Console.WriteLine("failed to load {0}", file);
Console.WriteLine(ex.ToString());
}
}
}
请注意,此方法是下载nuget包后执行的事件处理程序
另外
请注意,您需要将
<KnownTypeName>
替换为来自程序集的预期类型名称(或者可能在程序集中运行所有公共类型的发现)
值得注意的是,我自己并没有执行此代码,也不能保证它可以开箱即用,但仍然可能需要进行一些调整。但希望这个概念可以让你解决问题。
答案 1 :(得分:-2)
不要这样做!您可能正在尝试在客户计算机上加载nugets以节省软件分发的空间。不是吗?
常见的推荐方法是下载nuget作为自动构建的第二步(下载源代码后),构建软件并使用已下载的nugets运行自动化测试。然后使用您已经测试过的整个单元分配构建。