目前遇到c++调用C#写的DLL 问题,把C#的DLL注册为COM组件,在本机测试完成了,但在客户的机器上无法通过,注册的方式是通过Regasm 去注册dll 和tlb文件 ,但是排查注册表的时候发现未完全注册进去,在其它机器上是否需要加codebase,请各位大神帮帮忙,感谢
C# dll调用了外部的dll
这是源码
接口:
[Guid("3965F09B-9EE3-42F7-9908-CCA1BEC8603C")]
public interface ICalc
{
[DispId(1)]
void Join(string a,string b, out string c);
}
类:
[Guid("ABFADDE2-185D-4118-BC54-57458343BD8A")]
[ClassInterface(ClassInterfaceType.None)]
public class Calc:ICalc
{
public void Join(string a, string b, out string c)
{
string url = "tcp://10.1.1.198:8085";
ClientUtils.url = url;
string cc = string.Empty;
//DataSet ds = new DataSet();
//string ssql = "select * from sajet.sys_emp where emp_no = '" + b + "'";
//ds = ClientUtils.ExecuteSQL(ssql);
//if (ds.Tables[0].Rows.Count > 0)
//{
// cc = ds.Tables[0].Rows[0]["EMP_NAME"].ToString();
//}
//else
//{
// cc = "NG";
//}
//c = cc;
//return;
if (a == "1")
{
object[][] Params = new object[16][];
Params[0] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet1", a };
Params[1] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet2", b };
Params[2] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet3", "" };
Params[3] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet4", "" };
Params[4] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet5", "" };
Params[5] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet6", "" };
Params[6] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet7", "" };
Params[7] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet8", "" };
Params[8] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet9", "" };
Params[9] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet10", "" };
Params[10] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet11", "" };
Params[11] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet12", "" };
Params[12] = new object[] { ParameterDirection.Input, OracleType.VarChar, "tsajet12ton", "" };
Params[13] = new object[] { ParameterDirection.Input, OracleType.VarChar, "trev", "" };
Params[14] = new object[] { ParameterDirection.Output, OracleType.VarChar, "TRES", "" };
Params[15] = new object[] { ParameterDirection.Output, OracleType.VarChar, "tnextproc", "" };
DataSet ds2 = ClientUtils.ExecuteProc("SAJET.COMMAND_CODE_OTP", Params);
cc = ds2.Tables[0].Rows[0]["TRES"].ToString();
}
c = cc;
return;
}
}
c是否已执行此过程:项目右键》“属性”》“生成”》“为COM互操作注册”
这两个都有勾选
@Chirs:
https://www.cnblogs.com/huangmianwu/p/6145044.html com+;
https://www.cnblogs.com/yilin/p/csharp-activex.html activex;
你参考一下,看看接口实现没。
@花飘水流兮: 我是按照第一个链接写的,本机可以实现,但是在其它机器上报错, 如果在其它机器上装了VS 通过VS去生成,这样子也可以实现,但是不可能每一台 客户的机子都转VS的 所以现在问题卡在这里
@花飘水流兮: 还有,第一个链接哪里那个 通过用Regasm注册那一步骤需要有什么特别注意的地方么
@Chirs: 生成后就跟vs没关系了,应该是你的Framework、regasm.exe之类的环境版本问题,你对比一下。
@Chirs:
一路OK了,现在说明你的问题多半是环境问题。
过程(除了vs安装的过程注入的参数)暂无没有其他参数,那么首先检查Framework执行环境和regasm.exe的版本。
Microsoft .NET Framework 程序集注册实用工具版本 4.7.2556.0
(适用于 Microsoft .NET Framework 版本 4.7.2556.0) —— 注意
版权所有 (C) Microsoft Corporation。保留所有权利。
@花飘水流兮: 请问下您有没有在其它机器测试一下?
@花飘水流兮: 可以加一下QQ联系下么
@花飘水流兮: 我很需要解决这个问题,如果您能帮助我解决,可以有偿的
@花飘水流兮: regasm版本不同是否有影响
@Chirs:
Microsoft .NET Framework 程序集注册实用工具版本 4.7.2556.0
(适用于 Microsoft .NET Framework 版本 4.7.2556.0) —— 注意
版权所有 (C) Microsoft Corporation。保留所有权利。
看“注意”行 —— 微软已经说得清楚了。
将目标平台(platform)从Any CPU
改为x64
或x86
试试
调用了外部DLL会有影响么
@Chirs: 建议先用x64试试
@Chirs: 缺少引用的文件,当然会有影响
@新的开始: 没有缺少
mark.
666666