将程序集与部分类链接

时间:2011-12-08 20:46:08

标签: c# dll .net-assembly partial-classes

我有一个名为common的常见项目。 Inside是一个名为ExtensionMethods的类,由遗留应用程序使用。我想将类拆分为多个文件,但保持名称相同。所以我没有public static class ExtensionMethods {}而是public static partial class ExtensionMethods {}

当我删除从部分类创建的新dll时,我正在使用dll的一个遗留应用程序获得Method not found:异常。是什么造成的?文件名信息是否以某种方式嵌入到dll中?部分类使旧的和新的DLL不兼容吗?这是怎么回事? dll没有版本化,我们没有使用gac。它只是一个简单的dll放在与exe相同的目录中。

更新 感谢大家到目前为止的建议。这是我到目前为止检查的内容 相同的命名空间:检查。
相同的签名:检查。
仍公开:检查。

我可以构建遗留应用程序,它可以毫无错误地构建。

是的,异常告诉我它是什么方法。找不到方法:

'System.Collections.Generic.IEnumerable\`1<!!0> CompanyName.Common.ExtentionMethods.Distinct(System.Collections.Generic.IEnumerable\`1<!!0>, System.Func\`3<!!0,!!0,Boolean>)'.

(可悲的是,“扩展”的拼写错误就是它在代码中的方式。)

我将开始使用大家建议的一些工具来进一步了解。

old dll new dll

答案:用户错误。我认为我复制的dll不是我认为我正在构建的新dll。我无法确定是否需要重建或源控制问题或仅仅是我的错误。无论如何,下面的两个答案都是正确的,部分类不是问题,两个答案都有帮助,但最后,我认为是反射器解决方案导致我找到问题。谢谢大家。

2 个答案:

答案 0 :(得分:2)

部分类是编译器技巧,仅此而已 - 最终程序集中没有任何有意义的差异。

所以,我认为你的实际问题在于其他地方。

检查您获得的例外的详细信息,并查看该特定方法的来源。

另外,抓住ReflectordotPeek之类的检查工具来搜索程序集本身的类/方法,你应该很快找到问题。

答案 1 :(得分:2)

假设所有类都在同一名称空间中声明,那么它应该绝对正常。检查:

  • 这些类都在同一名称空间中(因此在结果程序集中只有一个具有该名称的类,而不是不同名称空间中的多个类)
  • 您的方法签名与以前完全 - 参数类型,方法名称等无法更改
  • 这些方法仍然是公开的

如果您尝试针对新DLL 构建旧版应用程序,会发生什么?这应该表明在编译时缺少方法,这应该会给你一个关于你出错的地方的提示。请注意,大概是“找不到方法”的例外应该告诉你无论如何都找不到方法......