[英]mySQL error with plugin loaded into appDomain
I am struggling to get dynamic loading working with my plugin. 我正在努力使动态加载与我的插件一起使用。 I'm loading the plugin into an appdomain but I get the following exception when my plugin tries to execute any mySQL code: 我正在将插件加载到appdomain中,但是当我的插件尝试执行任何mySQL代码时,我得到以下异常:
MySql.Data.MySqlClient.MySqlException was unhandled MySql.Data.MySqlClient.MySqlException未处理
Message=Access denied for user ''@'localhost' (using password: NO) 消息=拒绝访问用户“ @'localhost”(使用密码:否)
Here is the code on Plugins.cs: 这是Plugins.cs上的代码:
public class Plugins {
private static List<PluginContainer> PluginList;
public static bool PluginsAreLoaded {
get {
if(PluginList==null) {
return false;
}
else {
return true;
}
}
}
public static void LoadAllPlugins(Form host) {
//add assemblies in OD folder to appDomain
Assembly[] list = AppDomain.CurrentDomain.GetAssemblies();
AppDomain appDomainAnesthesia AppDomain.CreateDomain("appDomainAnesthesia");
for(int i=0;i<ProgramC.Listt.Count;i++) {
string dllPathWithVersion = String.Empty;
if(!ProgramC.Listt[i].Enabled) {
continue;
}
if(ProgramC.Listt[i].PluginDllName=="") {
continue;
}
string dllPath=ODFileUtils.CombinePaths(Application.StartupPath,ProgramC.Listt[i].PluginDllName);
if(dllPath.Contains("[VersionMajMin]")) {
Version vers=new Version(Application.ProductVersion);
dllPathWithVersion=dllPath.Replace("[VersionMajMin]",vers.Major.ToString()+"."+vers.Minor.ToString());
dllPath=dllPath.Replace("[VersionMajMin]","");//now stripped clean
if(File.Exists(dllPathWithVersion)){
File.Copy(dllPathWithVersion,dllPath,true);
}
}
if(!File.Exists(dllPath)) {
continue;
}
//add our plugin to the appDomain
try {
string typeName = Path.GetFileNameWithoutExtension(dllPath) + ".Plugin";
PluginBase plugin = (PluginBase)appDomainAnesthesia.CreateInstanceAndUnwrap(Path.GetFileNameWithoutExtension(dllPathWithVersion), typeName);
appDomainAnesthesia.Load(Path.GetFileNameWithoutExtension(dllPathWithVersion));
plugin.Host=host;
}
catch(Exception ex) {
MessageBox.Show(ex.Message);
continue;//don't add it to plugin list.
}
PluginContainer container=new PluginContainer();
container.Plugin=plugin;
container.ProgramNum=ProgramC.Listt[i].ProgramNum;
PluginList.Add(container);
}
}
Here is PluginBase: 这是PluginBase:
public abstract class PluginBase : MarshalByRefObject {
private Form host;
///<summary>This will be a refrence to the main FormOpenDental so that it can be used by the plugin if needed. It is set once on startup, so it's a good place to put startup code.</summary>
public virtual Form Host {
get {
return host;
}
set {
host=value;
}
}
///<summary>These types of hooks are designed to completely replace the existing functionality of specific methods. They always belong at the top of a method.</summary>
public virtual bool HookMethod(object sender,string methodName,params object[] parameters) {
return false;//by default, no hooks are implemented.
}
///<summary>These types of hooks allow adding extra code in at some point without disturbing the existing code.</summary>
public virtual bool HookAddCode(object sender,string hookName,params object[] parameters) {
return false;
}
public virtual void LaunchToolbarButton(long patNum) {
}
} }
PluginContainer: PluginContainer:
class PluginContainer {
public PluginBase Plugin;
public long ProgramNum;
and finally, Plugin: 最后,插件:
public class Plugin : PluginBase {
private Form host;
public AnestheticData AnesthDataCur;
public AnestheticRecord AnestheticRecordCur;
public Patient PatCur;
public string SourceDirectory;
public string DestDirectory;
public System.ComponentModel.IContainer components;
public long patNum;
public static Procedure procCur;
public static List<Procedure> ProcList;
public static ODtextBox textNotes;
public override Form Host {
get {
return host;
}
set {
host=value;
ConvertAnesthDatabase.Begin();//if this crashes, it will bubble up and result in the plugin not loading. }
}
It bombs at the 它在
plugin.Host=host;
line on Plugins.cs
which comes from the ConverAnesthDatabase.Begin() method as there are multiple mySQL statements there. 来自ConverAnesthDatabase.Begin()方法的Plugins.cs上的Plugins.cs
,因为那里有多个mySQL语句。
I have access to the mySQL database, so that is not the issue. 我可以访问mySQL数据库,所以这不是问题。
How do I resolve this error? 如何解决此错误?
Try not to "extend" your PluginBase and use an Interface instead: 尽量不要“扩展”您的PluginBase并改用Interface:
public interface IPlugin
{
Form Host {get; set; }
bool HookMethod(object sender,string methodName,params object[] parameters);
bool HookAddCode(object sender,string hookName,params object[] parameters);
void LaunchToolbarButton(long patNum);
}
and then 接着
public class Plugin : IPlugin
{
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.