0

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

  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 是我在 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

我做错了什么?

4

1 回答 1

-1

为什么要手动加载程序集。您可以通过在项目文件中引用它们来做到这一点吗?

作为替代 SQLite 有 nuget 包。在为 AnyCPU/x86 或 x64 加载程序集时使用它非常方便)。

于 2013-08-03T05:25:00.857 回答