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

在Visual Studio中为C++项目添加C# .NET DLL引用及SQL Server连接方案咨询

解决C++项目添加C# DLL的问题及SQL调用方案

一、修复Add Reference窗口无法添加自定义C# DLL的问题

首先得明确:普通原生C项目没法直接引用.NET DLL,你的C项目必须是CLR(公共语言运行时)项目才能支持.NET交互。按以下步骤排查修复:

  1. 确认项目是否为CLR项目

    • 右键你的C++项目 → 属性 → 配置属性 → 常规
    • 找到「公共语言运行时支持」选项,设置为/clr(或/clr:latest,依VS版本而定)
    • 应用设置后重启Visual Studio,否则配置不会生效
  2. 重新打开Add Reference窗口添加DLL

    • 按路径Properties → Common Properties → Framework and References → Add new Reference打开窗口
    • 此时窗口左侧应该会出现「浏览」选项卡,点击后再点击右下角的「浏览...」按钮,直接定位到你的C# DLL文件路径即可添加
    • 如果还是找不到「浏览」选项,尝试手动编辑项目文件:
      • 右键项目 → 卸载项目 → 右键编辑.vcxproj文件
      • 在<ItemGroup>节点内添加以下代码(替换为你的DLL路径和名称):
        <Reference Include="YourCSharpDllName">
          <HintPath>..\YourCSharpProject\bin\Debug\YourCSharpDllName.dll</HintPath>
        </Reference>
        
      • 保存文件后右键项目 → 重新加载项目

二、C++调用C# DLL实现SQL Server操作的完整方案

你的核心需求用C#写SQL逻辑再让C++调用完全可行,以下是具体步骤:

1. 编写C#类库的SQL逻辑

创建一个.NET Framework类库项目(建议用.NET Framework 4.x,CLR项目对其支持最完善),编写公共的SQL操作类:

using System.Data;
using System.Data.SqlClient;

namespace SqlOperationLibrary
{
    // 公开类,确保C++能访问
    public class SqlDatabaseHelper
    {
        /// <summary>
        /// 执行查询,返回DataSet
        /// </summary>
        public DataSet ExecuteQuery(string connectionString, string sqlQuery)
        {
            using (var conn = new SqlConnection(connectionString))
            {
                conn.Open();
                var adapter = new SqlDataAdapter(sqlQuery, conn);
                var dataSet = new DataSet();
                adapter.Fill(dataSet);
                return dataSet;
            }
        }

        /// <summary>
        /// 执行增删改操作,返回受影响行数
        /// </summary>
        public int ExecuteNonQuery(string connectionString, string sqlCommand)
        {
            using (var conn = new SqlConnection(connectionString))
            {
                conn.Open();
                using (var cmd = new SqlCommand(sqlCommand, conn))
                {
                    return cmd.ExecuteNonQuery();
                }
            }
        }
    }
}

2. C++项目配置与调用代码

确保你的C项目已经配置为CLR项目,并添加了上述C# DLL的引用,然后在C代码中调用:

#include "stdafx.h"
// 引入必要的.NET程序集
#using <System.Data.dll>
// 引入你的C# DLL(如果已经通过Add Reference添加,也可以用自动生成的命名空间)
#using "..\SqlOperationLibrary\bin\Debug\SqlOperationLibrary.dll"

using namespace SqlOperationLibrary;

int main()
{
    // 创建C#类的实例(用gcnew托管指针)
    SqlDatabaseHelper^ sqlHelper = gcnew SqlDatabaseHelper();
    
    // SQL Server连接字符串
    System::String^ connStr = "Server=.;Database=YourDatabaseName;Integrated Security=True;";
    
    // 执行查询
    System::String^ query = "SELECT * FROM YourTableName";
    System::Data::DataSet^ resultSet = sqlHelper->ExecuteQuery(connStr, query);
    
    // 遍历查询结果
    for each (System::Data::DataTable^ table in resultSet->Tables)
    {
        System::Console::WriteLine("表名:" + table->TableName);
        for each (System::Data::DataRow^ row in table->Rows)
        {
            // 替换为你的列名
            System::Console::WriteLine("列值:" + row["YourColumnName"]);
        }
    }

    // 执行插入操作
    System::String^ insertCmd = "INSERT INTO YourTableName (YourColumnName) VALUES ('TestData')";
    int affectedRows = sqlHelper->ExecuteNonQuery(connStr, insertCmd);
    System::Console::WriteLine("受影响行数:" + affectedRows);

    return 0;
}

3. 关键注意事项

  • 平台一致性:C# DLL和C++项目的目标平台必须一致(同为x86或x64),否则会出现加载失败的问题
  • 调试支持:确保C# DLL的pdb文件和C++项目的输出目录在同一位置,方便跨语言调试
  • 复杂类型处理:如果需要传递复杂自定义类型,建议在C#中使用[Serializable]标记,或者转换为简单类型(如数组、字符串)传递,避免跨语言交互问题

内容的提问来源于stack exchange,提问作者VSB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:34:09