调用 C# 应用程序形成非托管 C 应用程序
Calling C# application form unmanaged C application
我有一个旧的 C++ 应用程序,它被其他一些 MFC 和 WPF 应用程序调用。
此应用程序使用 MIDL_INTERFACE
公开其功能,例如:
// in header file:
MIDL_INTERFACE("00020400-0000-0000-C000-000000000046")
IDispatch : public IUnknown
{
public:
virtual HRESULT Connect(long hwnd);
//...
}
MIDL_INTERFACE("D949F6BF-B8D5-4A3F-A7A7-83E9CBCE88DE")
App : public IDispatch
{
public:
HRESULT __stdcall Connect(long hwnd);
//...
}
应用程序的实现如下:
// in .cpp file:
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow) { /*...*/ }
STDMETHODIMP App::Connect(long hwnd) { /*...*/ }
在不弄乱没人理解的旧 C++ 代码的情况下,我想使用 C# 重新编写此应用程序。
目前,我可以轻松地在其他 WPF 应用程序中调用我重写的 C# 应用程序,只需添加对我的 .exe 文件的引用。
我知道我可以通过在 VisualStudio 中注册 COM 互操作来构建一个单独的 dll(如 this article)。但是我怎样才能让其他 MFC 应用程序引用我的新 .exe,而不需要额外的 COM dll?
将 C# 类(在您的新 exe 中)公开为 COM 对象,然后您将能够从 C++/MFC 调用它们。更多细节在这里 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/example-com-class.
我有一个旧的 C++ 应用程序,它被其他一些 MFC 和 WPF 应用程序调用。
此应用程序使用 MIDL_INTERFACE
公开其功能,例如:
// in header file:
MIDL_INTERFACE("00020400-0000-0000-C000-000000000046")
IDispatch : public IUnknown
{
public:
virtual HRESULT Connect(long hwnd);
//...
}
MIDL_INTERFACE("D949F6BF-B8D5-4A3F-A7A7-83E9CBCE88DE")
App : public IDispatch
{
public:
HRESULT __stdcall Connect(long hwnd);
//...
}
应用程序的实现如下:
// in .cpp file:
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow) { /*...*/ }
STDMETHODIMP App::Connect(long hwnd) { /*...*/ }
在不弄乱没人理解的旧 C++ 代码的情况下,我想使用 C# 重新编写此应用程序。 目前,我可以轻松地在其他 WPF 应用程序中调用我重写的 C# 应用程序,只需添加对我的 .exe 文件的引用。
我知道我可以通过在 VisualStudio 中注册 COM 互操作来构建一个单独的 dll(如 this article)。但是我怎样才能让其他 MFC 应用程序引用我的新 .exe,而不需要额外的 COM dll?
将 C# 类(在您的新 exe 中)公开为 COM 对象,然后您将能够从 C++/MFC 调用它们。更多细节在这里 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/example-com-class.