Есть 2-а проекта с одним интерфейсом одна либа другая программа , которая её динамически
подключает.
Почему-то программа считает что они несовместимы.
Можно, конечно сделать промежуточную dll c интерфейсом, но мне нельзя это делать.
Помогите.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LibClass
{
public interface IClass
{
void Write();
int Ref(ref int f);
}
}
На текущий момент решил проблему, только через строковый доступ , но считаю это не очень оптимально.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace My_Project.Trace
{
class IncludeLibrary
{
public IncludeLibrary(string PathDll)
{
if (System.IO.File.Exists(PathDll))
{
Assembly Ass = Assembly.LoadFrom(PathDll);
ListTypes = Ass.GetTypes(); // Чтение всех типов
isValid = true;
}
else
{
Console.WriteLine("Dll не найдена:" + PathDll);
}
}
public bool isValid = false;
public static bool operator ==(IncludeLibrary LibA, IncludeLibrary LibB)
{
if ((object)LibA != null && !LibA.isValid)
{
LibA = null;
}
if ((object)LibB != null && !LibA.isValid)
{
LibB = null;
}
return object.Equals(LibA, LibB);
}
public static bool operator !=(IncludeLibrary LibA, IncludeLibrary LibB)
{
return !(LibA == LibB);
}
public object DllClass(string FindClass, params object[] argsClass)
{
findDllClass = null;
if (ListTypes != null)
{
foreach (Type type in ListTypes)
{
if (type.FullName.Equals(FindClass))
{
findClassType = type;
if (argsClass != null)
{
findDllClass = Activator.CreateInstance(findClassType, argsClass);
}
else
{
findDllClass = Activator.CreateInstance(findClassType);
}
}
}
if (findDllClass == null)
{
Console.WriteLine("Plugin"+ FindClass + " not find");
}
}
return findDllClass;
}
/// <summary>
/// Запустить метод класса, найденный при вызове DllClass
/// </summary>
/// <param name="function"></param>
/// <param name="argsClass"></param>
/// <returns></returns>
public object Method(string function, params object[] argsClass)
{
return Method(findDllClass, function, argsClass);
}
public object Method(object Class, string function, params object[] argsClass)
{
object ret = null;
MethodInfo mi = null;
bool InvokeCorrect = false;
try
{
if (Class != null)
{
mi = Class.GetType().GetMethod(function);
if (mi != null)
{
ret = mi.Invoke(Class, argsClass);
InvokeCorrect = true;
}
}
}
catch
{
ret = null;
}
if (!InvokeCorrect)
{
Console.WriteLine(String.Format("{0}.{1} error in Plugin {2}", (Class != null) ? Class.GetType().Name : "null", function, (mi == null) ? "or function not find" : ""));
}
return ret;
}
object findDllClass = null;
Type findClassType = null;
Type[] ListTypes = null;
}
}