如何从非托管c应用程序调用c#Web服务

时间:2017-05-09 20:06:55

标签: c wcf c++-cli unmanaged dllexport

我有以下架构:
-1 c#wcf web service
-1 c#console应用程序
-1 c ++类库
-c。的Microsoft样本密钥存储提供商 我想要做的是在该示例密钥存储提供程序中调用Web服务。我在c#console应用程序中使用了一个带有方法的类来使用该Web服务并且工作得很好。我使用那个c ++类库作为c#console应用程序的包装器 好的,现在我在提供程序项目中创建了一个.h文件和.c文件,我尝试加载库类创建的dll,然后在提供程序的OpenKey函数中使用它。这个文件看起来像:
.h

#pragma once      
//Declare ITEM struct again (the same definition from dll sources)    
typedef struct {    
unsigned char* data;
unsigned int len;
} ITEM;


//Declare function pointers
typedef ITEM(*_fptr_callWS)   (char*, ITEM, char*); //pointer to a function 
with the following signature:  ITEM function_name (char* ,ITEM ,char* )
typedef void(*_fptr_freeITEM) (ITEM); //pointer to a function with the 
following signature: void function_name (ITEM )

                                      /*The ITEM returned is freed using 
freeItem(ITEM) function*/
ITEM callWS(char* myAlias, ITEM hash, char* myPassword);

/*This function deletes an item which was returned from callWS(...) 
function*/
void freeITEM(ITEM item);  

.C

#include"dllWrapper.h"
#include <Windows.h>
#include <stdio.h>

ITEM callWS(char* myAlias, ITEM hash, char* myPassword)
{
ITEM signature;
signature.data = NULL;
signature.len = 0;

//Load DLL
HINSTANCE dllHandle = LoadLibraryA("serviceConsumerWrapper.dll");
if (!dllHandle)
{
    printf("Error loading serviceConsumerWrapper.dll\n");
    return signature;
}

//Get callWS function pointer from loaded DLL
_fptr_callWS fptrCallWS = (_fptr_callWS)GetProcAddress(dllHandle, "callWS");
if (!fptrCallWS)
{
    printf("Error loading callWS function pointer\n");
    return signature;
}

//call function callWS using function pointer
return fptrCallWS(myAlias, hash, myPassword);

}


void freeITEM(ITEM item)
{
//Load DLL
HINSTANCE dllHandle = LoadLibraryA("serviceConsumerWrapper.dll");
if (!dllHandle)
{
    printf("Error loading serviceConsumerWrapper.dll\n");
    return;
 }

//Get callWS function pointer from loaded DLL
_fptr_freeITEM fptrFreeItem = (_fptr_freeITEM)GetProcAddress(dllHandle, 
"freeITEM");
if (!fptrFreeItem)
{
    printf("Error loading freeITEM function pointer\n");
    return;
}

//call function freeITEM using function pointer
fptrFreeItem(item);

}

好的,现在我尝试在我的提供商中使用这些功能。我包括&#34; wrapper.h&#34;我尝试使用这些功能。我认出了它们,但我仍然遇到链接器错误。

Error   LNK1120 2 unresolved externals  provider    
E:\Licenta_2016_Urian\New_site\Debug\SampleKSP.dll  1   
Error   LNK2019 unresolved external symbol _callWS referenced in function 
_SampleKSPOpenKey@20    provider    C:\Program Files (x86)\Windows 
Kits\8.0\Cryptographic Provider Development 
Kit\Samples\KeyStorageProviderSample\CPP\Provider\SampleKSP.obj 1   
Error   LNK2019 unresolved external symbol _freeITEM referenced in function 
_SampleKSPOpenKey@20    provider    C:\Program Files (x86)\Windows 
Kits\8.0\Cryptographic Provider Development 
Kit\Samples\KeyStorageProviderSample\CPP\Provider\SampleKSP.obj 1     

顺便说一下,我在该类库创建的dll上使用了dumpbin,它似乎正确地导出了函数。

0 个答案:

没有答案