为什么从嵌入式资源加载dll文件不起作用?

时间:2013-08-03 04:39:20

标签: c# system.data.sqlite

过去,我曾经通过在main方法中调用它来动态加载文件System.Data.SQLite.dll

  static void Main(string[] args)
    {
        try
        {
            string resource1 = "System.Data.SQLite.dll"; // 
            string resource2 = "Ionic.Zip.Reduced.dll";

            EmbeddedAssembly.Load(resource1, "System.Data.SQLite.dll");
            EmbeddedAssembly.Load(resource2, "Ionic.Zip.Reduced.dll");
             //
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        }
        catch (Exception E) { File.AppendAllText("myExcept.txt",E.Message); }
    }




  static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        return EmbeddedAssembly.Get(args.Name);
    }

EmbeddedAssembly.cs是我在this link in codeproject

上找到的一个类

我之前已经使用过这个方法,它对我有用,但是现在我需要从c#代码中动态编译一个cs文件:所以我添加了文件System.Data.SQLite.dll作为嵌入式资源和参考组件,像这样:

            ...

            String exeName = "myFile.exe"

            CompilerParameters cp = new CompilerParameters();
            cp.GenerateExecutable = true;

            cp.ReferencedAssemblies.Add("System.dll");
            cp.ReferencedAssemblies.Add("System.Data.dll");

            // add reference 
            cp.ReferencedAssemblies.Add("System.Data.SQLite.dll");

            // add embedded resources
            cp.EmbeddedResources.Add(@"System.Data.SQLite.dll");

            ...

但是在生成可执行文件之后仍然依赖于System.Data.SQLite.dll文件,所以如果我不将此文件放在与Exe相同的文件夹中,该文件将无效!

困惑我的另一件事是正确加载了Ionic.Zip.Reduced.dll文件,而System.Data.SQLite.dll正在抛出异常:

Cannot load file or assembly 'System.Data.SQLite, Version=1.0.86.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. The specified file cannot be found

我做错了什么?

1 个答案:

答案 0 :(得分:-1)

为什么要手动加载程序集。您可以通过在项目文件中引用它们来完成此操作吗?

作为另一种选择,SQLite有nuget包。在为AnyCPU / x86或x64加载程序集时使用它非常方便。