zoukankan      html  css  js  c++  java
  • Sample: Mixing Unmanaged C++, C++/CLI, and C# code

    From: Sample: Mixing Unmanaged C++, C++/CLI, and C# code

    We have this simple unmanaged C++ class UnmanagedFoo:

    E:\sample\vc\mixed>more ufoo.h
    #include <stdio.h>
    class UnmanagedFoo
    {
    public:
        UnmanagedFoo() {printf("Constructing UnmanagedFoo\n");}
        ~UnmanagedFoo() {printf("Destructing UnmanagedFoo\n");}
       void ShowYourself();
    };

    And implementation:

    E:\sample\vc\mixed>more ufoo.cpp
    #include "ufoo.h"
    void UnmanagedFoo::ShowYourself()
    {
        printf("UnmanagedFoo\n");
    }

    Another simple C++/CLI class ManagedFoo, with a member of UnmanagedFoo.

    E:\sample\vc\mixed>more mfoo.cpp
    #include "ufoo.h"
    #using <mscorlib.dll>
    using namespace System;

    ref class ManagedFoo
    {
    public:
        ManagedFoo()
        {
            Console::WriteLine("Constructing ManagedFoo");
            m_foo = new UnmanagedFoo();
            if (!m_foo) {
                throw gcnew OutOfMemoryException();
            }
        }
        ~ManagedFoo() {ShowDestruction();}
        !ManagedFoo() {ShowDestruction();}
        void ShowYourself()
        {
            Console::WriteLine("ManagedFoo");
            m_foo->ShowYourself();
        }
    private:
        void ShowDestruction()
        {
            if (m_foo) {
                delete m_foo;
            }

            Console::WriteLine("Destructing ManagedFoo");
        }
        UnmanagedFoo *m_foo;
    };

    C# class Bar uses ManagedFoo:

    E:\sample\vc\mixed>more bar.cs
    using System;
    class Bar
    {
        public static void Main()
        {
            ManagedFoo foo = new ManagedFoo();
            foo.ShowYourself();
        }
    }

    Let us build the project.

    First, compile ufoo.cpp into (unmanaged) obj file.

    E:\sample\vc\mixed>cl.exe /Zi /MD /c ufoo.cpp
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
    Copyright (C) Microsoft Corporation. All rights reserved.

    ufoo.cpp

    And mfoo.cpp

    E:\sample\vc\mixed>cl.exe /Zi /clr /c mfoo.cpp
    Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.42
    for Microsoft (R) .NET Framework version 2.00.50727.88
    Copyright (C) Microsoft Corporation. All rights reserved.

    mfoo.cpp

    And bar.cs, referencing mfoo.obj

    E:\sample\vc\mixed>csc /target:module /addmodule:mfoo.obj bar.cs
    Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.88
    for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
    Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

    Finally, let’s link everything together.

    E:\sample\vc\mixed>link mfoo.obj ufoo.obj bar.netmodule /entry:Bar.Main /out:test.exe /subsystem:console /ltcg
    Microsoft (R) Incremental Linker Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    Generating code
    Finished generating code

    Now we have a single file assembly test.exe, mixed with unmanaged C++, C++/CLI, and C#.

    E:\sample\vc\mixed>test
    Constructing ManagedFoo
    Constructing UnmanagedFoo
    ManagedFoo
    UnmanagedFoo
    Destructing UnmanagedFoo
    Destructing ManagedFoo

    We can also put ufoo.obj into a lib and link the lib in the final step, instead of using ufoo.obj directly.

    E:\sample\vc\mixed>lib ufoo.obj /out:ufoo.lib
    Microsoft (R) Library Manager Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    E:\sample\vc\mixed>link mfoo.obj ufoo.lib bar.netmodule /entry:Bar.Main /out:test2.exe /subsystem:console /ltcg
    Microsoft (R) Incremental Linker Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    Generating code
    Finished generating code

    E:\sample\vc\mixed>test2
    Constructing ManagedFoo
    Constructing UnmanagedFoo
    ManagedFoo
    UnmanagedFoo
    Destructing UnmanagedFoo
    Destructing ManagedFoo
     

  • 相关阅读:
    request常用的方法
    JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金)
    基于云原生的秒杀系统设计思路
    html<input>输入框中各种正则表达式设置
    cursor:hand与cursor:pointer的区别介绍
    读入/输出优化
    手动扩栈,防止溢出
    快速乘(O(1))
    二分图若干性质
    康拓展开
  • 原文地址:https://www.cnblogs.com/taoxu0903/p/1772892.html
Copyright © 2011-2022 走看看