在用C#准备插件时,我经常在Visual Studio中手动添加SAPBobsCOM类型库参考。 现在,我想构建自己的插件,并使其使用SAPbobsCOM90.dll(对于运行SAP Business One版本9.x的用户)或SAPbobsCOM100.dll(对于运行SAp Business One版本10.x的用户)
在用C#准备插件时,我经常在Visual Studio中手动添加SAPBobsCOM类型库参考。 现在,我想构建自己的插件,并使其使用SAPbobsCOM90.dll(对于运行SAP Business One版本9.x的用户)或SAPbobsCOM100.dll(对于运行SAp Business One版本10.x的用户)
您解决了这个问题吗?
您可以检查CINF表以检查用户运行的版本,然后将适当的DLL复制到运行时。 在Visual Studio中,只有在将"嵌入"设置为false并将"复制本地"设置为True时,此方法才有效。
你好库尔特,
我早在一段时间(8.82 vs 9.0的时候)就一直在研究这个问题。
那我的结论是,因为SAPbobsCOM.dll是一个非托管的COM对象,
一个人真的不想在编程时使用后期绑定。
只需查看下面的代码即可连接到SAP公司对象:
AppDomain.CurrentDomain.AssemblyResolve + =委托(对象发送者,ResolveEventArgs e)
{
System.Reflection.AssemblyName requiredName =新的System.Reflection.AssemblyName(e.Name);
string v_AssemblyPath;
如果(requestedName.Name ==" Interop.SAPbobsCOM,版本= 8.8.0.0,文化=中性,PublicKeyToken =空")
{
//在此处放置代码以加载您实际拥有的程序集的任何版本
v_AssemblyPath = @" Interop.SAPbobsCOM88.dll";
返回System.Reflection.Assembly.LoadFrom(v_AssemblyPath);
}
如果(requestedName.Name ==" Interop.SAPbobsCOM,版本= 9.2.0.0,文化=中性,PublicKeyToken =空")
{
//在此处放置代码以加载您实际拥有的程序集的任何版本
v_AssemblyPath = @" Interop.SAPbobsCOM92.dll";
返回System.Reflection.Assembly.LoadFrom(v_AssemblyPath);
}
其他
{
返回null;
}
};
动态o_Company = Activator.CreateInstance(Type.GetTypeFromProgID(" SAPbobsCOM.Company"));
o_Company.Server ="服务器名称";
o_Company.CompanyDB =" sql_db_name";
o_Company.DbUserName =" sa";
o_Company.DbPassword =" sa_password";
字符串v_Path = @" C:\ dev \ MultipleSAPVersions \ bin \ Debug \ Interop.SAPbobsCOM.dll";
System.Reflection.Assembly组装= System.Reflection.Assembly.LoadFrom(v_Path);
类型类型;
type = assembly.GetType(" SAPbobsCOM.BoDataServerTypes");
o_Company.DbServerType =(dynamic)Enum.Parse(type," dst_MSSQL2008");
o_Company.UserName ="经理";
o_Company.Password =" manager_password";
如果(o_Company.Connect()!= 0)
{
//错误
}
其他
{
//好!
}
我最终以更加整洁的方式解决了这个问题:多个VS解决方案都使用相同的代码:每个VS解决方案都包含链接到同一"黄金"解决方案的"项目"(阅读:c#代码)。
然后,每个VS解决方案都针对不同的SAP B1版本进行了编译。 (不同的VMware映像)。一周热门 更多>