You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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访问权限即可。

  1. 先修改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;
        }
    }
}
  1. 修改wrapper.dll,公开类型别名:
using Dimensions;
namespace wrapper
{
    // 对外公开Size类型别名,上层项目可以直接用wrapper.Size访问
    public using Size = Dimensions.Size;
    
    public class DimensionsWrapper
    {
        public DimensionsWrapper(Size size){
            // 原有构造逻辑保持不变
        }
    }
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:30:47