2015-03-30 75 views
0

我已经被委托编写一个新的接口到一个传统的C++ DLL我没有源代码,这是 - 由于我以外的原因 - 访问遗留下的全局类直接应用。从C++ DLL访问C#静态类

从应用程序,它是这样的:

extern Interface *App; 

... 

Interface App*; // A pointer to our interface class. 

然后,从传统的DLL:

if(App->GetStatus()) return false; 

接口类应用程序是指是相当琐碎的C#改写,但如何我可以使它相当于extern,以便传统的C++ DLL可以访问它吗?

谢谢!

+1

你不会得到很远,这个只要你写'接口应用*,理解指针对于获取某个地方非常重要。从C++调用C#代码需要首先加载CLR。有许多方法以错误的方式做到这一点,即以“简单”的方式开始。在C++中使用#import指令是一个正确的方法。教育自己,向你的主管询问你需要的资源。 – 2015-03-30 23:00:04

+0

请记住,海报表示他无法访问C++源代码,因此加载CLR可能会造成问题... – 2015-04-01 13:38:48

回答

0

你可以尝试使用罗伯特捷的“UnmanagedExports” NuGet包来实现这一功能,像这样:

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)] 
    public static int TestExport(int left, int right) 
    { 
     return left + right; 
    } 
} 

然而

一)我相信这只是作品的方法,而不是类和

b)在C#中没有本地方式导出DLL的原因是因为调用应用程序必须加载.NET框架才能访问该入口点。这也适用于我链接到上面的UnmanagedExports nuget包。

在调用C#应用程序之前,您可以通过让C++应用程序加载单声道来解决这个问题,但它听起来不像您的情况。

(。此外,UnmanagedExports将只有当你明确地设置在项目属性构建目标努力 - 例如86)

+0

只要调用一个导出的方法,就会加载.net框架。您的C++应用程序甚至可以使用不同版本的框架。 – jbriggs 2015-03-30 23:00:59

+0

只有当您的应用程序使用C++/CLI编写时才会发生这种情况。如果你的C++代码是非托管的,它将不会加载.net框架 – 2015-03-30 23:07:37

+0

我从命令行编译了一个本地C++程序'cl/EHsc MyConsoleApp.cpp/Fe:MyConsoleApp.exe' 在cpp文件中我有'typedef void \t (__stdcall * OPENDEVICES)();'' OPENDEVICES \t OpenDevices;'' HINSTANCE hGetProcIDDLL =的LoadLibrary( “MyCSharpLib.dll”);'' OpenDevices \t = OPENDEVICES(GetProcAddress的(HMODULE(hGetProcIDDLL), “OpenDevices”)) ;' 这工作。 MyCSharplib.dll使用.Net 4.0创建。我有一个使用Visual Studio 2005的客户,在应用程序中使用它没有问题。 – jbriggs 2015-03-31 18:18:54