我寫了一個.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服務中。
有沒有人有任何想法?
如果確實是這樣編譯的話,那麼我不妨敲掉整個項目的頭部。目前我正在做的只是一個測試應用程序。這樣做對於整個項目來說就像是一場維護噩夢。感謝您的鏈接。 – Jonnster 2011-06-06 12:20:03
我認爲它真的歸結爲只創建一個.net dll並使用「添加服務引用」選項來創建一個服務代理,然後從C++應用程序調用公開代理方法的.net dll方法。我是一個C++開發人員12年以上,但在6年左右沒有使用C++ ...這只是痛苦的:) – jonchicoine 2011-06-06 16:33:06