我必须用c#编写一个dll,它连接到一个Web服务,从该Web服务读取一些值,并用它填充一个数据库。该dll应该被delphi应用程序使用。
我已经设法使用dll导出属性来发布dll中的函数,并使delphi能够使用它们。问题似乎是,当我从delphi调用函数时,app.config(Web服务的信息似乎来自这里(没有被使用。
C#DLL:
namespace SomeDLL
{
[DllExport]
public static bool GetClients(int userId, [MarshalAs(UnmanagedType.LPWStr)] string url)
{
try
{
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
using (var client = new SomeWebserviceClient())
using (var scope = new OperationContextScope(client.InnerChannel))
{
var someData = client.GetSomeData();
//Insert data to db
}
return true;
}
catch (Exception e)
{
MessageBox.Show($"{e.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
}
我可以在C#控制台应用程序中使用这个dll,如下所示:
class Program
{
static void Main(string[] args)
{
try
{
var id = 1;
var url = "bla";
SomeDLL.GetClients(id, url);
}
catch (Exception e)
{
Console.WriteLine($"Exception: {e}");
}
finally
{
Console.ReadKey();
}
}
}
到目前为止,这还可以。但是当我尝试从delphi调用这个函数时,如下所示:
function GetClients(userId: Integer; url: String) : Boolean; stdcall; external 'SomeDLL.dll';
procedure TForm1.Button1Click(Sender: TObject);
var bResult: Boolean;
begin
try
bResult := GetClients(1, 'bla');
if bResult
then RichEdit1.Text := 'true'
else RichEdit1.Text := 'false';
except on e: Exception do
RichEdit1.Text := e.Message;
end;
end;
我得到错误
找不到具有名称和约定的端点元素
如果我从控制台项目中删除app.config(我从dll项目中复制的(,这与我从控制台应用程序中得到的错误相同。我已经尝试将c#与SomeDLL.dll文件一起创建的SomeDLL.dll.config复制到delphi应用程序所在的目录中,但似乎仍然无法使用配置文件。
如果我删除了dll中使用Web服务的部分,则没有错误。因此,我想问题的真正原因在于没有app.config,Web服务无法正常工作。
你知道我该怎么做吗?
所以我找到了一个解决方案。不是因为我的问题,而是因为潜在的问题。。。
问题是,delphi无法导入wsdl文件,因为该文件本身是从其他xsd文件导入数据类型的。Delphi会创建一些方法,但是xsd文件中的所有数据类型都不存在。delphi团队已经尝试使用这个WSDLMerge工具将xsd文件合并到wsdl文件中。但他们报告说,这并不奏效。
我自己下载了这个工具并尝试使用它。当使用本地文件时,这个工具似乎运行起来没有问题。但合并后的文件与输入文件相同。因此,尚未进行合并。
通过将targetframework设置为.net Framework 4.6.2并使用wsdl文件的webadress,我能够正确地使用它。我仍然收到一条错误消息,说与ssl证书有一些冲突。我添加了这个:
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
行忽略ssl证书验证。现在再次运行该工具,并且文件已正确合并。我能够在delphi中导入新的合并wsdl文件,现在一切都正常了。我将合并后的wsdl文件发送给了delphi团队,他们现在可以自己使用Web服务了。。。