Nebula3 in CLR

有用N3 + CLR做界面的冲动

新建一个CLR WinForm工程, 直接引入N3的头文件和库进行编译........

编译不过, 找了半天才发现原因

晕死, .Net和N3都有个System命名空间, 没法改Microsoft的东西, 只好把N3的System改成了NSystem

然后就是链接不过

一是__fastcall不被CLR支持, 改成__cdecl (/Gd)重遍

二是Multi-threaded Debug (/MTd)跟/clr冲突, 改成Multi-threaded Debug DLL (/MDd)

终于链接过了.............

启动程序, Crash掉

拿着关键字就去问google, 没想到MSDN论坛上还真有解决方法(感谢我的先驱们, 我成功是了站在你们的"尸体"上)

原因是N3的对象系统在ImplementClass时定义了一些静态对象, 如果直接用CLR会导致不能正解地进行初始化

解决方案(引用原文):

Workaround Steps:
In the project properties:

1. Set Linker/Advanced/Entry Point to "" (empty string)
2. Set Linker/System/Subsystem to Not Set


Step 1: Makes sure that the CRT startup code is invoked. This is because, if no entry point is specified, the linker will automatically use mainCRTStartup, which is defined in the CRT libraries. mainCRTStartup will make sure that the global object is initialized correctly.

Step 2: Makes sure that the linker will look for the symbol “main”. The linker looks for “main” because mainCRTStartup calls main() in its body. The default option for a Winforms application is Subsystem:Windows and this makes the linker look for WinMain().

Thanks

Sarita Bafna

Visual C++ team

测试程序:

// N3CLR.cpp : main project file. 

#include "stdafx.h" 
#include "MainForm.h" 
#include "stdneb.h" 
#include "core/coreserver.h" 
#include "io/ioserver.h" 

using namespace N3CLR;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
 // Enabling Windows XP visual effects before any controls are created 
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);

    Ptr<Core::CoreServer> coreServer = Core::CoreServer::Create();
    coreServer->Open();
    n_printf("Hello CLR!");
    coreServer->Close();
    coreServer = NULL;
 // Create the main window and run it 
    Application::Run(gcnew MainForm());
 return 0;
}

如果想嵌入到WinForm中的话, 需要更改DisplayDevice中的hWnd, 我的做法是把DisplayDevice创建的窗口做为WinForm的子窗口.

注意InputDevice需要最顶层的窗口句柄来创建:

 // set the cooperative level of the device, we're friendly 
 // note: use Win32's FindWindow() to find our top level window because  
 // the DisplayDevice may be running in a different thread 
 HWND hWnd = FindWindow(NEBULA3_WINDOW_CLASS, NULL);
 if (0 == hWnd)
    {
        hWnd = DisplayDevice::Instance()->GetParentWnd();
    }
    n_assert(0 != hWnd);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法修养

HttpClient参观记:.net core 2.2 对HttpClient到底做了什么?

.net core 于 10月17日发布了 ASP.NET Core 2.2.0 -preview3,在这个版本中,我看到了一个很让我惊喜的新特性:HTTP C...

20510
来自专栏NetCore

[原创]Fluent NHibernate之旅(四)-- 关系(上)

经过了前面三篇的介绍,相信大家对Fluent NHibernate已经有一定的了解了,在我们学习中,Fluent 也已经进入了RTM版本。这次的版本发布离RC版...

23160
来自专栏张善友的专栏

重新审视SqlDataReader的使用

      ADO.NET 1.x 利用SqlDataReader读取数据,针对每个结果集需要一个独立的连接。当然,你还必须管理这些连接并且要付出相应的内存和潜...

21690
来自专栏张善友的专栏

Windows 7上执行Cake 报错原因是Powershell 版本问题

在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started...

25690
来自专栏高性能服务器开发

关于windows完成端口(IOCP)的一些理解(五)

系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)...

549110
来自专栏JAVA高级架构

分布式之延时任务方案解析

14320
来自专栏木宛城主

ASP.NET那点不为人知的事(四)

虽然开发中很少接触多线程,但你必须承认你离不开他。 接着上篇博客(ASP.NET那点不为人知的事(三)),基本可以实现一个Mini版的服务器,但也有不足: 倘若...

20370
来自专栏张善友的专栏

依赖注入容器Autofac

在.NET上现在存在许多的依赖注入容器, 我也在实践中使用过Castle Windsor、StructureMap、Autofac 、Unity。这些容器的简要...

29390
来自专栏本立2道生

Win32对话框程序(1)

之前学C语言是一直都是在控制台下面操作的,面对的都是黑框框,严重的打击了学习的兴趣。后来在TC下进行C语言课程设计,做了图形界面编程,但都是点线面画的…… 

21610
来自专栏跟着阿笨一起玩NET

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

本文转载:http://blog.csdn.net/playing9c/article/details/7471918

71610

扫码关注云+社区

领取腾讯云代金券