如何解决无法通过反射加载项目
我正在尝试在运行时使用WpfCustomControlLibrary
加载Reflection
,但是当它必须访问System.IO.FileNotFoundException
时会抛出System.Data.sqlite
。
当前设置的想法是,只要与特定的Interface
匹配,运行中的应用程序就不会知道它必须加载的确切控件。
这时,我正在尝试直接从WpfCustomControlLibrary
的Debug文件夹中加载项目,以确保所有引用的库与项目本身都位于同一目录中。
这是我当前尝试加载控件的方式:
UserControl myControl = null;
Assembly asm = Assembly.LoadFrom(@"SomePath\bin\Debug\ControlLibrary.dll");
Type[] types = null;
try
{
types = asm.GetTypes();
if (types != null)
{
foreach (var t in types.Where(t => t != null))
{
if (t.Name == "MyControl")
{
myControl = Activator.CreateInstance(t) as UserControl;
Type[] ifs = t.GetInterfaces();
var project = ifs.FirstOrDefault(x => x == typeof(IMyInterface));
if(project != null)
{
IMyInterface actualProject = myControl as IMyInterface;
//Creates a new database when none exists.
actualProject.Init(@"Data Source=.\Database.db;Version=3;"); //<-- It fails on this line
actualProject.Start();
}
break;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Failed to load Project: {ex}");
}
当我将MyControl
作为参考项目加载时,访问System.Data.sqlite
没有任何问题。
actualProject.Init
方法基本上运行以下代码:
// Create database if it doesn't exist yet
foreach (string sub in this.ConnectionString.Split(';'))
{
string prefix = "Data Source=";
if (sub.Contains(prefix))
{
string name = sub.Remove(0,prefix.Length);
if (!File.Exists(name))
{
sqliteConnection.CreateFile(name);
}
}
}
编辑:添加了堆栈跟踪。不幸的是我的工作电脑不是英语,所以我不得不翻译一些内容。
Stacktrace:
在Database.DbConnection.CreateDatabaseIfNeeded() 在\ usercontrol项目路径\ DbConnection.cs:line 32中的Database.DbConnection..ctor(String ConnectionString) 在\ usercontrol project path \ connectors \ Database.cs:line 43中的ControlLibrary.connectors.Database..ctor(String ConnectionString) 在\ usercontrol项目路径\ UserControl1.xaml.cs:line 779中的ControlLibrary.UserControl1.Init(String DatabaseConnectionString) 在\ main project path \ DynamicProjectLoaderTest \ MainWindow.xaml.cs:line 56
中的DynamicProjectLoaderTest.MainWindow.BtnLoad1_Click(对象发送方,RoutedEventArgs e)处
似乎没有在正确的目录中搜索System.Data.sqlite.dll,因为该文件实际上位于以下任一位置:
usercontrol项目路径\ bin \ Debug \ x64或
usercontrol项目路径\ bin \ Debug \ x86。
FusionLog:
===绑定前的状态信息=== 日志:displayName = System.Data.sqlite,版本= 1.0.112.1,区域性=中性,PublicKeyToken = db937bc2d44ff139 (完全指定) 日志:Appbase = file:///主项目路径/ DynamicProjectLoaderTest / bin / Debug / 日志:最初PrivatePath = NULL 调用程序集:数据库,版本= 1.0.0.0,文化=中性,PublicKeyToken =空。 ===
LOG:此绑定从LoadFrom加载上下文开始。 WRSCH:在LoadFrom上下文中未搜索本机图像。仅在默认的加载上下文(例如Assembly.Load())中搜索本机图像。 日志:使用的应用程序配置文件:主项目路径\ bin \ Debug \ DynamicProjectLoaderTest.exe.Config LOG:使用主机配置文件: 日志:来自C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config wordt gebruikt的计算机配置文件。 日志:在策略之后进行引用:System.Data.sqlite,版本= 1.0.112.1,区域性=中性,PublicKeyToken = db937bc2d44ff139 日志:尝试下载URL文件:///主项目路径/ bin / Debug / System.Data.sqlite.DLL 。 日志:尝试下载URL文件:///主项目路径/bin/Debug/System.Data.sqlite/System.Data.sqlite.DLL。 日志:尝试下载URL文件:///主项目路径/bin/Debug/System.Data.sqlite.EXE。 日志:尝试下载URL文件:///主项目路径/bin/Debug/System.Data.sqlite/System.Data.sqlite.EXE。 日志:尝试下载URL文件:///控制项目路径/ bin / Debug / System.Data.sqlite.DLL 。 WRSCH:比较程序集名称显示以下内容不匹配:版本号 日志:尝试下载文件:///控制项目路径/bin/Debug/System.Data.sqlite/System.Data.sqlite.DLL。 日志:尝试下载文件:///控制项目路径/ bin / Debug / System.Data.sqlite.EXE 下载。 日志:尝试下载URL文件:///控制项目路径/bin/Debug/System.Data.sqlite/System.Data.sqlite.EXE。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。