2011-06-06 99 views
0

我寫了一個.NET Windows服務,它內置了一個WCF服務。我可以從Visual Studio 2010中編寫的C#客戶端調用此方法。但是,我也需要從Visual Studio 6編寫的MFC應用程序中調用它。我添加了COM Interop代碼來嘗試實現此目的,創建了一個snk文件,使用了regasm註冊並安裝它。無法從C++調用.Net服務

WCF服務和MFC應用程序都是32位。

我的WCF服務接口的代碼看起來是這樣的

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IGASR" in both code and config file together. 
[Guid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")] 
[ServiceContract] 
public interface IMyClass 
{ 
    [OperationContract] 
    void AddFile(string sFilename); 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)] 
public class MyClass : IMyClass 
{ 
    public void AddFile(string sFilename) 
    { 
     ... 
    } 
} 

我的MFC代碼如下所示:

CoInitialize(NULL); 

MyNamespace::IMyClassPtr pDotNetCOMPtr; 

HRESULT hRes = 
    pDotNetCOMPtr.CreateInstance(MyNamespace::CLSID_MyClass); 
if (hRes == S_OK) 
{ 
    pDotNetCOMPtr->AddFile (_bstr_t(m_strFilename)); 
} 

CoUninitialize(); //DeInitialize all COM Components 

然而,的CreateInstance失敗的-2147221164一個HRESULT。即班級沒有登記。我錯過了什麼?

更新: 我添加ComVisible(true)到接口上的Guid行,並將/ codebase選項添加到regasm調用。現在,從MFC應用程序中,CreateInstance成功,但對AddFile的調用不起任何作用。沒有錯誤,但方法未被調用。我知道這是因爲我登錄了該方法。此方法在C#.NET客戶端上正常工作。

因此,我越來越近,但現在不明白爲什麼方法調用不會創建錯誤,但尚未調用到我的.NET服務中。

有沒有人有任何想法?

回答

0

也許這會有所幫助。看起來方式複雜得多,我也能猜到:)

Create WCF service for unmanaged C++ clients

好運

+0

如果確實是這樣編譯的話,那麼我不妨敲掉整個項目的頭部。目前我正在做的只是一個測試應用程序。這樣做對於整個項目來說就像是一場維護噩夢。感謝您的鏈接。 – Jonnster 2011-06-06 12:20:03

+0

我認爲它真的歸結爲只創建一個.net dll並使用「添加服務引用」選項來創建一個服務代理,然後從C++應用程序調用公開代理方法的.net dll方法。我是一個C++開發人員12年以上,但在6年左右沒有使用C++ ...這只是痛苦的:) – jonchicoine 2011-06-06 16:33:06

0

您是否將您的C#項目設置爲在其項目構建設置中註冊COM互操作?無論是或者您需要運行regasm手動註冊.NET DLL。

+0

在構建設置COM互操作選項寄存器變灰。我不知道爲什麼。也許這與問題有關。如果任何人有任何想法如何啓用這個選項,那麼請讓我知道。我手動使用regasm,但它沒有幫助。 – Jonnster 2011-06-06 11:59:42

+0

請看我在這個問題上的更新。它現在似乎正確註冊CreateInstance成功。然而,對該方法的調用失敗(沒有錯誤,但沒有被調用) – Jonnster 2011-06-06 12:56:44