【问题标题】:TypeLoadException on Assembly.GetType Explicit Interface implementationAssembly.GetType 显式接口实现上的 TypeLoadException
【发布时间】:2013-09-14 07:52:29
【问题描述】:

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

程序集“MyPart2Assembly,版本...”中的“MyPart2DerivedType”类型中的方法“MyMethod”没有实现。我试图理解为什么会这样,因为我已经阅读了几篇文章,甚至试图手动删除 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();)

【问题讨论】:

  • 你用什么参数调用这个程序?项目 4 和 5 中的程序集是否与 exe 位于同一文件夹中?
  • 是的,但是 dll 是我传入的完整路径
  • 请告诉我参数。
  • "c:\myassemblyfolder\Project5.dll" "MyNameSpace.MyDerivedType"
  • 我会尝试在 Project 5 之前加载 Project 4 程序集

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


【解决方案1】:

好的,对于所有对我的愚蠢修复感兴趣的人。这是我的问题:

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

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

请从我的挫折/错误中吸取教训。恶魔不要让朋友单独 DI(代码审查是抓住这些愚蠢东西的关键)。

【讨论】:

  • 很好地找到了那个。哦,请把测试代码的教训也带回家:当您可以创建一个简单的复制品并将其发布到 SO 上时,您很可能能够自己修复它。 我经常开始输入问题在这里,当我将它与复制代码一起完全制定时,我发现了问题所在。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多