C#+MySQL的问题:由于特殊原因,无法在C#中直接引用MySQL.Data,因此不得已只能只用Reflection来做,从国外的平台找到的代码如下,稍加修改发现还是有报错
Visual Studio 2022开发,然后报错位置在下面43行,
methodMysqlConnection_Open.Invoke(oMySqlConnection, null);
报错内容
内部异常 1:
FileNotFoundException: Could not load file or assembly 'System.Diagnostics.DiagnosticSource, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. 系统找不到指定的文件。
完整代码如下:
using System.Reflection;
using System.Windows;
internal class Program
{
private static void Main(string[] args)
{
Assembly assMySqlData = Assembly.LoadFrom(@"c:\FAConfig\MySql.Data.dll");
Type typeMySqlConnection = assMySqlData.GetType("MySql.Data.MySqlClient.MySqlConnection");
Type typeMySqlCommand = assMySqlData.GetType("MySql.Data.MySqlClient.MySqlCommand");
Type typeMySqlDataReader = assMySqlData.GetType("MySql.Data.MySqlClient.MySqlDataReader");
object oMySqlConnection = Activator.CreateInstance(typeMySqlConnection);
if (oMySqlConnection != null)
{
MethodInfo methodMysqlConnection_State = typeMySqlConnection.GetMethod("get_State");
MethodInfo methodMysqlConnection_Open = typeMySqlConnection.GetMethod("Open");
MethodInfo methodMysqlConnection_ConnectionString = typeMySqlConnection.GetMethod("set_ConnectionString");
MethodInfo methodMysqlConnection_Close = typeMySqlConnection.GetMethod("Close");
MethodInfo methodMysqlConnection_Dispose = typeMySqlConnection.GetMethod("Dispose");
Console.WriteLine(typeMySqlConnection.ToString());
Console.WriteLine(oMySqlConnection.ToString());
MethodInfo methodMysqlCommand_ExecuteReader = typeMySqlCommand.GetMethod("ExecuteReader", new Type[] { });
MethodInfo methodMysqlCommand_Connection = typeMySqlCommand.GetMethod("set_Connection", new Type[] { typeMySqlConnection });
MethodInfo methodMysqlCommand_CommandText = typeMySqlCommand.GetMethod("set_CommandText");
MethodInfo methodMysqlCommand_Dispose = typeMySqlCommand.GetMethod("Dispose");
MethodInfo methodMysqlDataReader_Read = typeMySqlDataReader.GetMethod("Read");
MethodInfo methodMysqlDataReader_HasRows = typeMySqlDataReader.GetMethod("get_HasRows");
MethodInfo methodMysqlDataReader_FieldCount = typeMySqlDataReader.GetMethod("get_FieldCount");
MethodInfo methodMysqlDataReader_GetValue = typeMySqlDataReader.GetMethod("GetValue");
MethodInfo methodMysqlDataReader_Close = typeMySqlDataReader.GetMethod("Close");
MethodInfo methodMysqlDataReader_Dispose = typeMySqlDataReader.GetMethod("Dispose", new Type[] { });
object[] arg = new object[] { (string)"Server=localhost;Database=download;User=root;Password=root;" };
methodMysqlConnection_ConnectionString.Invoke(oMySqlConnection, arg);
methodMysqlConnection_Open.Invoke(oMySqlConnection, null);
object mysqlState = methodMysqlConnection_State.Invoke(oMySqlConnection, null);
Console.WriteLine(mysqlState.ToString());
object oMysqlCommand = Activator.CreateInstance(typeMySqlCommand);
if (oMysqlCommand != null)
{
object[] paramCommandConnection = new object[] { oMySqlConnection }; //oMysqlConnection is not null
object[] paramCommandText = new object[] { "SELECT * FROM `filelist`" };
methodMysqlCommand_CommandText.Invoke(oMysqlCommand, paramCommandText); //works fine
methodMysqlCommand_Connection.Invoke(oMysqlCommand, paramCommandConnection); // error no object
Console.WriteLine("5");
object oMysqlDataReader = methodMysqlCommand_ExecuteReader.Invoke(oMysqlCommand, null);
Console.WriteLine("6");
object retRows = methodMysqlDataReader_HasRows.Invoke(oMysqlDataReader, null);
Console.WriteLine("7");
Console.WriteLine(retRows.ToString());
Console.WriteLine("8");
}
}
Console.ReadKey();
}
}