gpt4 book ai didi

c# - 从非托管 C++ 调用 WCF 服务导致访问冲突

转载 作者:行者123 更新时间:2023-11-28 08:00:21 27 4
gpt4 key购买 nike

我想从非托管代码访问 wcf 服务。该服务只是连接字符串并返回它们,以保持简单。

public class Stringconcat : IStringconcat
{
public string stringconcat(string a, string b)
{
return b + a;
}
}

[ServiceContract]
public interface IStringconcat
{
[OperationContract]
string stringconcat(string a, string b);
}

我使用引用该服务的 .dll 的 C# 控制台应用程序托管该服务。并公开服务的端点。在 Main() 中:

using (ServiceHost host = new ServiceHost(typeof(stringconcatservice.Stringconcat)))
{
host.Open();
Console.WriteLine("Press <ENTER> to terminate the host application");
Console.ReadLine();
}

主机的配置如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="serviceBehavior"
name="stringconcatservice.Stringconcat" >
<endpoint address="stringconcat" binding="basicHttpBinding"
name="basicHttp" contract="stringconcatservice.IStringconcat" />
<endpoint binding="mexHttpBinding" name="mex"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/stringconcatService" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

现在,如果我从一个 .net 客户端调用该服务,该服务使用该服务引用的基地址,那么一切正常。

StringconcatClient proxy = new StringconcatClient();

string a = " string a ";
string b = " string b ";
string c = proxy.stringconcat(a, b);

Console.WriteLine(c);
Console.WriteLine("Press <ENTER> to terminate Client.");
Console.ReadKey();

现在说说我遇到的问题。因为我想从非托管 C++ 代码访问该服务。为此,我使用了一个 .dll,它注册了 com interop,还使用了正在运行的主机的服务引用。

[Guid("E4435D3B-CBC3-4D41-B4A5-D8116B394195")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Stringconcat_IAMCOM : IStringconcat_IAMCOM
{
public string stringconcat(string a, string b)
{
StringconcatClient client = new StringconcatClient();
return client.stringconcat(a, b);
}
}
[Guid("E130F97E-1844-4C8B-9E57-AF42632A2557")]
[ComVisible(true)]
public interface IStringconcat_IAMCOM
{
[DispId(1)]
string stringconcat(string a, string b);
}

现在,当我尝试通过使用 C++ 的中介 .dll 访问服务时...

#import "..\stringconcatInteropSvcClient\bin\Debug\stringconcatInteropSvcClient.tlb" 
#include <iostream>
#include <stdio.h>
using namespace stringconcatInteropSvcClient;
int main(int argc, const char* argv[])
{
HRESULT hr = CoInitialize(NULL);
BSTR a = L" string a ";
BSTR b = L" string b ";
IStringconcat_IAMCOM* q;
hr = CoCreateInstance(__uuidof(Stringconcat_IAMCOM), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IStringconcat_IAMCOM), (void**)&q );
std::cout << q->stringconcat(a, b);

//Uninitialize COM.
CoUninitialize();
return 0;
}

...我在 stringconcatinteropsvcclient.tli 中遇到异常,例如:

“xyz.exe 中 0x75 处的未处理异常:Microsoft C++ 异常:内存位置 0x 处的 _com_error...”

然后我可以继续并在 strlen.asm 中获取下一个异常:

“xyz.exe 中 0x5d 处的未处理异常……(msvcr100d.dll):0xC0……:访问冲突读取位置 0x00……”

在此异常停止后。也许有人对此问题有解决方案,或者知道错误可能出在哪里。我只是使用这个例子来保持简单。我正在从事的项目使用相同的结构。它还使用 wcf 服务,这些服务将从非托管 C++ 中调用。

最佳答案

刚刚创建了一个小测试项目,它正在运行:

namespace ComTest
{
[Guid("E4435D3B-CBC3-4D41-B4A5-D8116B394195")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Stringconcat_IAMCOM : IStringconcat_IAMCOM
{
public string stringconcat(string a, string b)
{
return a + b;
}
}
[Guid("E130F97E-1844-4C8B-9E57-AF42632A2557")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IStringconcat_IAMCOM
{
[DispId(1)]
string stringconcat(string a, string b);
}
}

和客户:

#import "C:\Users\rst\Documents\Visual Studio 2008\Projects\ComTest\ComTest\bin\Debug\ComTest.tlb" 
#include <iostream>
#include <stdio.h>
#include <windows.h>

using namespace ComTest;

int main(int argc, const char* argv[])
{

HRESULT hr = CoInitialize(NULL);
BSTR a = L" string a ";
BSTR b = L" string b ";
IStringconcat_IAMCOM* q;
hr = CoCreateInstance(__uuidof(Stringconcat_IAMCOM), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IStringconcat_IAMCOM), (void**)&q );
std::cout << q->stringconcat(a, b);

//Uninitialize COM.
CoUninitialize();
return 0;
}

我的程序集名称是 ComTest.dll,所以我使用以下方法注册了它:

regasm Comtest.dll /CodeBase

关于c# - 从非托管 C++ 调用 WCF 服务导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11646422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com