C#未直接引用传递依赖DLL时能否使用其中自定义数据类型
C# 间接引用DLL的类型使用方案
问题本质
C# 编译器默认只会从项目直接引用的程序集中解析类型,不会主动遍历间接依赖的DLL查找类型定义,因此你在MyProject中直接写size类型会提示找不到。
另外你当前代码还有两个额外问题会导致编译失败:
dimensions.dll中的Size类默认是internal访问权限,本身就禁止跨程序集直接访问- 类名
Size和构造函数名size大小写不匹配,C#对大小写敏感,构造函数名必须和类名完全一致
无需MyProject直接引用dimensions.dll的可行方案
方案1:在wrapper层公开Size类型别名(推荐,改动最小)
这是成本最低的实现方式,只需要修改wrapper.dll的代码,通过全局using别名把Dimensions.Size重新对外导出,同时把dimensions里的Size类改成public访问权限即可。
- 先修改dimensions.dll的Size类定义,加public访问修饰符:
namespace Dimensions { // 加public允许跨程序集访问 public class Size : Someclass { public int length { get; set; } public int width { get; set; } public int height { get; set; } // 构造函数名和类名统一大小写 public Size() { height = 0; width = 0; length = 0; } } }
- 修改wrapper.dll,公开类型别名:
using Dimensions; namespace wrapper { // 对外公开Size类型别名,上层项目可以直接用wrapper.Size访问 public using Size = Dimensions.Size; public class DimensionsWrapper { public DimensionsWrapper(Size size){ // 原有构造逻辑保持不变 } } }
- MyProject中不需要添加dimensions.dll引用,直接使用即可:
using wrapper; class Program { static void Main() { Size mySize = new Size(); mySize.length = 5; mySize.height = 6; mySize.width = 7; DimensionsWrapper myVar = new DimensionsWrapper(mySize); } }
如果你需要在不修改dimensions代码的前提下扩展Size的功能,也可以直接在wrapper中定义继承自Dimensions.Size的公开类,效果和别名一致。
方案2:wrapper层封装工厂方法(推荐,封装性最好)
如果你不希望MyProject感知到Size类型的存在,可以把Size的创建逻辑完全封装在wrapper内部,上层只需要传必要参数即可,完全不需要接触dimensions层的任何类型。
只需要在wrapper.dll中添加静态工厂方法:
using Dimensions; namespace wrapper { public class DimensionsWrapper { // 原有构造函数可以改成internal,不让外部直接调用 internal DimensionsWrapper(Size size){ // 原有构造逻辑 } // 对外公开工厂方法,直接接收长宽高参数 public static DimensionsWrapper Create(int length, int width, int height) { var size = new Size { length = length, width = width, height = height }; return new DimensionsWrapper(size); } } }
MyProject中的代码可以简化到完全不涉及Size类型:
using wrapper; class Program { static void Main() { DimensionsWrapper myVar = DimensionsWrapper.Create(5, 7, 6); } }
这个方案的耦合度最低,后续如果dimensions层的类型定义发生变化,只需要修改wrapper层的工厂逻辑,上层业务代码不需要做任何调整。
方案3:动态类型反射创建(不推荐,仅应急使用)
如果你完全不能修改dimensions和wrapper的代码,可以通过反射动态加载dimensions程序集创建实例,不需要在项目中添加直接引用:
using wrapper; using System.Reflection; class Program { static void Main() { // 运行时动态加载dimensions程序集 Assembly dimAssembly = Assembly.Load("dimensions"); // 获取Size类型定义 Type sizeType = dimAssembly.GetType("Dimensions.Size"); // 动态创建实例 dynamic mySize = Activator.CreateInstance(sizeType); mySize.length = 5; mySize.height = 6; mySize.width = 7; DimensionsWrapper myVar = new DimensionsWrapper(mySize); } }
这个方案没有编译时类型检查,属性名拼写错误、类型不匹配等问题都会到运行时才抛出异常,也没有IDE智能提示,除非万不得已不建议使用。
内容的提问来源于stack exchange,提问作者2letuknow
相关产品推荐
相关产品推荐

