Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从路径加载程序集_C#_Gac - Fatal编程技术网

C# 从路径加载程序集

C# 从路径加载程序集,c#,gac,C#,Gac,我需要从某个位置加载程序集,而不是从GAC加载。我无法从GAC中删除程序集,因为我的程序必须在不同的机器上运行,在这些机器上我无法控制程序集是否在GAC中 我在项目中添加了对DLL文件的引用。不幸的是,程序集是从GAC加载的 我在启动-事件中的App.xaml.cs中尝试了以下代码 var directory = Thread.GetDomain().BaseDirectory; var dllPath = Path.Combine(directory, "MyAssembly.dll"); v

我需要从某个位置加载程序集,而不是从GAC加载。我无法从GAC中删除程序集,因为我的程序必须在不同的机器上运行,在这些机器上我无法控制程序集是否在GAC中

我在项目中添加了对DLL文件的引用。不幸的是,程序集是从GAC加载的

我在
启动
-事件中的
App.xaml.cs
中尝试了以下代码

var directory = Thread.GetDomain().BaseDirectory;
var dllPath = Path.Combine(directory, "MyAssembly.dll");
var assembly = Assembly.LoadFrom(dllPath);
不幸的是,程序集仍然是从GAC加载的

即使程序集位于GAC中,如何从给定位置加载它?

签出

从MSDN:

Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
// Obtain a reference to a method known to exist in assembly.
MethodInfo Method = SampleAssembly.GetTypes()[0].GetMethod("Method1");
// Obtain a reference to the parameters collection of the MethodInfo instance.
ParameterInfo[] Params = Method.GetParameters();
// Display information about method parameters. 
// Param = sParam1 
//   Type = System.String 
//   Position = 0 
//   Optional=False 
foreach (ParameterInfo Param in Params)
{
    Console.WriteLine("Param=" + Param.Name.ToString());
    Console.WriteLine("  Type=" + Param.ParameterType.ToString());
    Console.WriteLine("  Position=" + Param.Position.ToString());
    Console.WriteLine("  Optional=" + Param.IsOptional.ToString());
}
即使在加载自定义程序集之后,也不能像通常那样简单地调用方法或使用类型。看看这个例子,被盗自,它应该为您指出正确的方向:

 Assembly assembly = Assembly.LoadFile("myAssembly");
        Type type = assembly.GetType("myAssembly.ClassName");
        if (type != null)
        {
            MethodInfo methodInfo = type.GetMethod("MyMethod");
            if (methodInfo != null)
            {
                object result = null;
                ParameterInfo[] parameters = methodInfo.GetParameters();
                object classInstance = Activator.CreateInstance(type, null);
                if (parameters.Length == 0)
                {
                    //This works fine
                    result = methodInfo.Invoke(classInstance, null);
                }
                else
                {
                    object[] parametersArray = new object[] { "Hello" };

                    //The invoke does NOT work it throws "Object does not match target type"             
                    result = methodInfo.Invoke(classInstance, parametersArray);
                }
            }
        }

不幸的是,您无法绕过GAC-
Assembly.LoadFrom()
Assembly.LoadFile()
,甚至无法将其加载到字节数组中并使用
Assembly.Load(byte[])
将首先检查GAC中具有相同标识的程序集,然后将其加载

您以前可以在.net 1.1中执行您想要的操作,但从2.0开始,GAC将首先检查。-注意,第3步是在探测目录之前检查GAC(即使您完全指定了它)

如果您想加载一个用于反射(检查程序集,而不是运行它),可以使用

它应该允许您将DLL与代码合并,这样就不会下载任何外部内容,并且您不必支付反射成本,因此性能应该会更好

ILMerge接受一组输入程序集并将它们合并为一个 目标组件。输入程序集列表中的第一个程序集是 主程序集。当主程序集是可执行程序时,则 目标程序集被创建为具有相同项的可执行文件 点作为主部件。此外,如果主部件具有 强名称,并提供一个.snk文件,则目标程序集为 使用指定的密钥重新签名,使其也具有强名称

另一个选项是从该DLL中删除强名称。看这里

Reflexil能够删除程序集强名称并更新引用 装配。您也可以使用部件编辑器自己执行此操作: 删除公钥并将HasPublicKey标志设置为false


程序集是否具有强名称?在调用
assembly.LoadFrom
之前,您确定没有加载程序集吗?嗯,可能吧?你可以像他所展示的那样实例化程序集,但他是使用实例化的程序集来调用他的方法,还是在调用
assembly.LoadFrom()
后像往常一样调用它们?我不确定它将如何处理强命名程序集?我不知道
assembly.Load(byte[])
仍然使用GAC,你能提供参考吗?@SriramSakthivel这是张俊峰的一篇博客文章,描述了这一变化