Assembly.GetType显式接口实现的TypeLoadException

时间:2013-09-10 14:31:43

标签: c# interface dependency-injection .net-3.5

所以这是我的问题。我有一个复杂的接口和抽象类的结构,我试图通过Assembly.LoadFrom(“x.dll”)加载。当某些具有实现在基类中显式的接口实现的类型正在尝试加载时,我收到一个TypeLoadException:

程序集'MyPart2DerivedType'中的方法'MyMethod'来自程序集'MyPart2Assembly,version ...'没有实现。我试图理解为什么这是因为我已经阅读了几篇文章,甚至试图手动删除obj文件和dll。以下是我到目前为止所做的参考:

Solution to TypeLoadException

TypeLoadException says 'no implementation', but it is implemented

Visual Studio Forumns: TypeLoadException

Private accessors and explicit interface implementation

所以这是我的示例代码:

//This is in project 1
public interface IFooPart1
{
    void DoStuff();
}

//This is in project 2
public interface IFooPart2
{
    void DoOtherStuff();
}

//This is in project 3
public interface IFooPart3: IFooPart1, IFooPart2
{
    void DoEvenMoreStuff();
}

//This is in project 4
public abstract class MyBaseType: IFooPart1, IFooPart2
{
    void IFooPart1.DoStuff()
    {
        DoStuffInternal();
    }

    void IFooPart2.DoOtherStuff()
    {
        DoOtherStuffInternal();
    }
}

//This is in project 5
public class MyDerivedType: MyBaseType, IFooPart3
{
    public void DoEvenMoreStuff()
    {
        //Logic here...
    }
}

//Only has references to projects 1, 2, & 3 (only interfaces)
public class Program
{
    void Main(params string[] args)
    {
        //Get the path to the actual dll
        string assemblyDll = args[0];

        //Gets the class name to load (full name, eg: MyNameSpace.MyDerivedType)
        string classNameToLoad = args[1];

        //This part works...
        var fooAssembly = Assembly.LoadFrom(assemblyDll);

        //Here we throw a TypeLoadException stating
        // Method 'DoStuff' in type 'MyDerivedType' from assembly 'Project 5...' does
        //  not have an implementation.
        Type myDerivedTypeExpected = Assembly.GetType(classNameToLoad);
    }
}

注意:如果我将显式实现移动到MyDerivedType而不是MyBaseType,它可以工作......但是我不知道为什么我必须这样做。好像我应该能够。这段代码只是一个例子,实际代码有一个工厂,它返回加载的类,但只能通过接口类型。 (例如:var myDerivedType = GetInstance();)

2 个答案:

答案 0 :(得分:3)

对于对我的愚蠢修复感兴趣的每个人都可以。这是我的问题:

Project6(它是控制台应用程序)具有对其他项目的PROJECT引用,而不是对它们应该构建的位置中的dll的引用。实际上,其他项目正在构建到特定的存储库区域。因此,控制台应用程序在尝试自动加载依赖项时使用它自己的dll版本。这显然是在那里进行了一些其他类型的动态加载而不加载,因为它与那里的dll不在同一个文件夹中......

简而言之,Assembly.LoadFrom可能会导致您加载程序集两次,但.NET将其视为不同的程序集!在尝试动态加载类型时,这可能会引入一些奇怪的错误!!!

请从我的沮丧/错误中吸取教训。恶魔不会​​让朋友独自一人(代码审查是捕捉这些愚蠢的东西的关键)。

答案 1 :(得分:0)

我遇到过类似的问题,我的一个项目引用了旧版本的nuget包依赖项。旧版本没有其中一种方法的实现。