生成.dll供其他项目调用时遇字段被当作类型使用的错误求助
解决DLL引用时“字段被当作类型使用”的编译错误
看起来你遇到的是典型的字段与类型混淆的编译错误,咱们一步步拆解问题,找到解决办法:
错误本质分析
报错提示'TS_COM.Bus_D.Device1' is a 'field' but is used like a 'type',核心问题是:你在代码里把Bus_D类中的一个字段成员,当成了类/结构体类型来使用(比如用它来声明变量或者实例化对象)。
分步解决方案
1. 检查原DLL项目的Bus_D类结构
首先确认原DLL项目中,Device1和Device2的定义是否符合你的预期:
- ❌ 错误写法(如果是字段就会导致这个问题):
namespace TS_COM { public class Bus_D { // 这里Device1是Bus_D类的字段,不是类型 public Device1 Device1; public Device2 Device2; } } - ✅ 正确写法(如果是嵌套类型):
如果你希望Device1是可以实例化的类型,应该把它定义为Bus_D的嵌套类:namespace TS_COM { public class Bus_D { // 这里Device1是嵌套类类型 public class Device1 { // 类的成员和方法 } public class Device2 { // 类的成员和方法 } } }
2. 修正引用DLL后的使用代码
打开报错的sBusDriver.cs文件,检查38、39行的代码:
- ❌ 错误用法(把字段当类型实例化):
// 如果Device1是Bus_D的字段,这么写会触发编译错误 var device1 = new TS_COM.Bus_D.Device1(); - ✅ 正确用法分两种情况:
- 情况1:
Device1是嵌套类型 → 直接实例化即可(前提是原DLL里已经定义为类):var device1 = new TS_COM.Bus_D.Device1(); - 情况2:
Device1是Bus_D实例的字段 → 先实例化Bus_D,再访问字段:var busInstance = new TS_COM.Bus_D(); var device1 = busInstance.Device1;
- 情况1:
3. 确保引用的是最新版DLL
有时候修改原DLL项目后,没有重新编译或者引用的还是旧版本的DLL,导致代码和实际DLL中的定义不匹配。请:
- 重新编译原DLL项目,生成最新的
.dll文件; - 在引用项目中,删除旧的DLL引用,重新添加最新的版本。
4. 清理并重建解决方案
Visual Studio的缓存偶尔会引发奇怪的编译错误,试试以下步骤:
- 点击菜单栏的
Build→Clean Solution; - 重新编译原DLL项目,再编译引用它的
TS_COM项目。
内容的提问来源于stack exchange,提问作者Pradip Mali
相关产品推荐
相关产品推荐

