与两个dll互通但彼此不认识

时间:2019-02-11 10:15:50

标签: c# dll

我需要在给定的dll中未知的结构作为函数参数。

我想处理两种不同的类型。类型生成为两个不同的dll。我通过Xml-Serialization实例化了其中许多类型。第三方应用程序加载dll,并开始从给定的xml文件创建实例。然后,我遍历实例并从dll调用一个函数来执行类似导出的操作。在处理时,我想共享全局数据,以共享给下一个实例。问题在于,他们不了解全局数据。他们只有一个函数参数typeof(object)。如果我在每个dll中实现相同的结构,则无法将其强制转换为该结构,因为dll A和dll B不同。那我该怎么办...?

//Third party application
object globalData = null; //Type is not known in this application

//serialisation here...
I_SVExternalFruitExport[] instances = serialisation(....);

foreach(I_SVExternalFruitExport sv in instances)
{
    globalData = sv.ProcessMyType(globalData, sv);
}

//--------------------------------------------------------
// one DLL AppleExport implements I_SVExternalFruitExport
using Apple.dll

struct s_mytype // s_mytype  is known in this dll
{
    List<string> lines;
    ...
}
local_sv;
public object ProcessMyType(object s_TypeStruct, object sv)
{
     local_sv = (Apple)sv;
    if(globalData != null) globalData = new s_mytype();
    else globalData = (s_mytype)s_TypeData;
    //Do Stuff
    return globalData;
}


//--------------------------------------------------------
// second DLL OrangeExport  implements I_SVExternalFruitExport 
using Orange.dll

struct s_mytype    //s_mytype  is known in this dll
{
    List<string> lines;
    ...
}
Orange local_sv;   // Orange is known because of using Orange.dll

public object ProcessMyType(object s_TypeStruct, object sv)
{
    local_sv = (Orange)sv;
    if(globalData != null) globalData = new s_mytype();
    else globalData = (s_mytype)s_TypeData; //This cast says... s_TypeData is not s_mytype because of two dlls A and B but i know they have the same structure.
    //Do Stuff
    return globalData;
}

我需要一个在我的dll中已知但在第三方应用程序中未知的结构,因为我想重新生成我的dll,也许在该结构中包含更多信息。我不想每次更改dll时都更新第三方应用程序。

1 个答案:

答案 0 :(得分:0)

我认为我得到了答案: 我将使结构s_mytype {}也可序列化:

[Serializable]
public struct s_mytype
{
    public List<string> lines;
    [System.Xml.Serialization.XmlElementAttribute("Lines", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string[] Lines 
    { 
       get { return lines.ToArray(); } 
       set { lines.AddRange(value); } 
    }
}

我的函数“ ProcessMyType()”现在必须返回带有xml数据的字符串:

public string ProcessMyType(object s_TypeStruct, object sv)

现在唯一的事情是,“ Apple”或“ Orange”的每个实例都必须首先对xml进行反序列化,并且每个实例的大小都越来越大。 我的生成器保证每个dll中都具有相同的s_mytype结构。

也许这篇文章使问题更加明确。如果有更简单的方法或诸如反序列化之类的较少过载的方法,请告诉我。