Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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中从程序集及其依赖项创建实例#_C#_.net_Assemblies_Dependencies - Fatal编程技术网

C# 在C中从程序集及其依赖项创建实例#

C# 在C中从程序集及其依赖项创建实例#,c#,.net,assemblies,dependencies,C#,.net,Assemblies,Dependencies,我有一个应用程序(我们称之为MyApp),它动态地为一个类创建源代码,然后编译它。当它编译源代码时,我还引用另一个已经存在于另一个文件夹中的DLL(即新创建的类的基类)。我执行以下操作来编译和输出DLL: //Create a C# code provider CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); //Set the complier parameters CompilerParameters

我有一个应用程序(我们称之为MyApp),它动态地为一个类创建源代码,然后编译它。当它编译源代码时,我还引用另一个已经存在于另一个文件夹中的DLL(即新创建的类的基类)。我执行以下操作来编译和输出DLL:

//Create a C# code provider 
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

//Set the complier parameters
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = false;
cp.TreatWarningsAsErrors = false;
cp.WarningLevel = 3;
cp.OutputAssembly = "SomeOutputPathForDLL";

// Include referenced assemblies
cp.ReferencedAssemblies.Add("mscorlib.dll");
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Core.dll");
cp.ReferencedAssemblies.Add("System.Data.dll");
cp.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
cp.ReferencedAssemblies.Add("System.Xml.dll");
cp.ReferencedAssemblies.Add("System.Xml.Linq.dll");
cp.ReferencedAssemblies.Add("MyApp.exe");
cp.ReferencedAssemblies.Add("SomeFolder\SomeAdditionalReferencedDLL.dll");

// Set the compiler options
cp.CompilerOptions = "/target:library /optimize";
CompilerResults cr = provider.CompileAssemblyFromFile(cp, "PathToSourceCodeFile");
稍后在我的应用程序中(或下次应用程序运行时),我尝试创建该类的实例。我知道新创建的类(我们称之为Blah)的DLL和基类的位置。我使用以下代码尝试创建新类的实例:

Assembly assembly = Assembly.LoadFile("PathToNewClassDLL");
Blah newBlah = assembly.CreateInstance("MyApp.BlahNamespace.Blah") as Blah;
当我像上面那样调用Assembly.CreateInstance时,我会收到一个错误,说它无法创建实例。当我选中assembly.GetReferencedAssemblys()时,它有我的应用程序(MyApp.exe)的标准引用和引用,但没有我最初编译类时使用的依赖基类(SomeAdditionalReferencedDLL.dll)的引用

我知道我必须以某种方式添加基类引用才能创建实例,但我不知道如何做到这一点。当我拥有程序集及其所有依赖项时,如何从程序集创建类的实例


谢谢

您确定它在编译时引用了您认为它引用的DLL实例吗?它可能正在解析指向某个位置的路径,而不是您认为的在实例化类时无法再找到该DLL的位置。我建议获取编译过程和类型创建的融合日志,以查看类型是如何解析的。

我认为.Net正在尝试在bin或GAC中查找“SomeAdditionalReferencedDLL.dll”。在创建新Blah之前,是否尝试为“SomeAdditionalReferencedDLL.dll”执行Assembly.Load操作?

这听起来像是在动态生成的程序集中引用的程序集不在标准探测路径中

相对于其他事物,它位于哪里


您应该启动以查看出错的地方。

如果手动加载外部DLL(程序集),它将不会自动加载您引用的内容

因此,您必须创建一个AssemblyLoader。检查程序集的引用程序集并自己加载它们的代码

有关驻留在计算机上的奇数文件夹中而不是与编译的DLL一起的引用程序集的复杂性,请查看AppDomain.CurrentDomain.AssemblyResolve事件。(您使用它愚弄.NET接受正在加载的程序集,即使它不在GAC中或不在编译的DLL中)


使用代码手动加载引用的DLL后,CreateInstance将工作。

首先,我认为您具有循环依赖性。。你的最后一段总结了它。 您需要重新考虑您的应用程序,并决定是否正确设置了职责

为什么循环依赖:

要生成新的dll,它需要MyApp.exe

如果没有新的dll,则无法使用MyApp.exe

也许发布你的目标是什么,我们可以帮助你正确构建应用程序

在适当的职责下,MyApp.exe应使新生成的程序集不工作,而不要求MyApp.exe使用新dll中的对象

示例:您应该只对新生成的程序集执行

    public static void RenderTemplate(String templatepath, System.IO.Stream outstream, XElement xml, Dictionary<String, object> otherdata)
    {
        var templateFile = System.IO.File.ReadAllText(templatepath);

        var interpreter = new Interpreter();
        interpreter.ReferencedAssemblies.Add("System.Core.dll"); // linq extentions
        interpreter.ReferencedAssemblies.Add("System.Xml.dll");
        interpreter.ReferencedAssemblies.Add("System.Xml.Linq.dll");

        interpreter.UsingReferences.Add("System.Linq");
        interpreter.UsingReferences.Add("System.Xml");
        interpreter.UsingReferences.Add("System.Xml.Linq");
        interpreter.UsingReferences.Add("System.Collections.Generic");
        interpreter.Execute(templateFile, outstream, xml, otherdata);
    }
publicstaticvoidrenderTemplate(字符串模板路径、System.IO.streamoutstream、xelementxml、Dictionary-otherdata)
{
var templateFile=System.IO.File.ReadAllText(templatepath);
var解释器=新解释器();
解释器.ReferencedAssemblys.Add(“System.Core.dll”);//linq扩展
explorer.referencedAssemblys.Add(“System.Xml.dll”);
Add(“System.Xml.Linq.dll”);
explorer.UsingReferences.Add(“System.Linq”);
explorer.UsingReferences.Add(“System.Xml”);
explorer.UsingReferences.Add(“System.Xml.Linq”);
explorer.UsingReferences.Add(“System.Collections.Generic”);
执行(模板文件、扩展流、xml、其他数据);
}
//构造函数
静态MyClass()
{
//这是联合国大会议事录的回顾
AppDomain.CurrentDomain.AssemblyResolve+=新的ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
/// 
//M/Meeles LES大会
/// 
静态字典汇编路径;
/// 
///联合国大会的回顾
///ChelChet’s Apple D'Apple’s集会
/// 
/// 
/// 
/// 
静态程序集CurrentDomain_AssemblyResolve(对象发送方,ResolveEventArgs args args)
{
if(_AssembliesPath!=null&&u AssembliesPath.ContainsKey(args.Name))
{
Assembly=Assembly.LoadFile(_AssembliesPath[args.Name]);
AddAssemblyReferenceAssembly(lAssembly,System.IO.Path.GetDirectoryName(lAssembly.Location));
回蓝;
}
Error=string.Format(“L'assembly{0}n'a puêtre chargé”,args.Name);
返回null;
}
/// 
//M/Meeles LES大会
/// 
/// 
/// 
静态无效AddAssemblyReferencedAssemblys(程序集密码、字符串psRootPath)
{
如果(_AssembliesPath==null)_AssembliesPath=new Dictionary();
foreach(pAssembly.getReferencedAssemblys()中的AssemblyName lRefedAss)
if(!\u AssembliesPath.ContainsKey(lRefedAss.FullName))
{
字符串lsRoot=psRootPath+“\\”+lRefedAss.Name+”;
字符串lsEx
//Constructor
static MyClass()
    {
        //Provoque l'événement quand .Net ne sait pas retrouver un Assembly référencé
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

    }
    /// <summary>
    /// Mémorise les assembly référencés par d'autres qui ne sont pas dans le répertoire principal d'EDV
    /// </summary>
    static Dictionary<string, string> _AssembliesPath;
    /// <summary>
    /// .Net ne sait pas retrouver un Assembly référencé
    /// Cherche et charge d'après les assembly référencés par d'autres qui ne sont pas dans le répertoire principal d'EDV        
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="args"></param>
    /// <returns></returns>
    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        if (_AssembliesPath != null && _AssembliesPath.ContainsKey(args.Name))
        {
            Assembly lAssembly = Assembly.LoadFile(_AssembliesPath[args.Name]);
            AddAssemblyReferencedAssemblies(lAssembly, System.IO.Path.GetDirectoryName(lAssembly.Location));
            return lAssembly;
        }
        Error = string.Format("L'assembly {0} n'a pu être chargé", args.Name);
        return null;
    }
    /// <summary>
    /// Mémorise les assembly référencés par d'autres qui ne sont pas dans le répertoire principal d'EDV        
    /// </summary>
    /// <param name="pAssembly"></param>
    /// <param name="psRootPath"></param>
    static void AddAssemblyReferencedAssemblies(Assembly pAssembly, string psRootPath)
    {
        if (_AssembliesPath == null) _AssembliesPath = new Dictionary<string, string>();
        foreach (AssemblyName lRefedAss in pAssembly.GetReferencedAssemblies())
            if (!_AssembliesPath.ContainsKey(lRefedAss.FullName))
            {
                string lsRoot = psRootPath + "\\" + lRefedAss.Name + ".";
                string lsExt;
                if (System.IO.File.Exists(lsRoot + (lsExt = "dll")) || System.IO.File.Exists(lsRoot + (lsExt = "exe")))
                {
                    _AssembliesPath.Add(lRefedAss.FullName, lsRoot + lsExt);
                }
            }
    }