vc 调用C#

shaw0129 2009-09-14 12:25:00
以前的一个C#做的exe程序,里面的一些功能要复用到现在一个vc做的程序里面,那位大牛知道这个应该怎么修改?
怎么开接口,怎么调用?
...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaw0129 2009-09-22
  • 打赏
  • 举报
回复
谢谢 楼上的两位,主要考虑到原来没有开托管,开了可能要引入很多东西 影响性能,主要没有接触过,不太好下手~~
I_NBFA 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shaw0129 的回复:]
谢谢 楼上的,就是说要在vc的那个程序里面开托管? 可是怎么调用呢?
[/Quote]

可以先把C#写成DLL, 然后调用.
网上非托管C++调用C#的资料挺多的你看看.

想在代码级复用, 如果代码不多的话, 可以改写成托管C++代码啊, 反正语法差不多, 你认为呢?
ChrisAK 2009-09-17
  • 打赏
  • 举报
回复
两种办法...
一是改用C++/CLI,直接引用C#程序集.
二就比较麻烦,可能需要你重新编译C#程序.
首先C#程序必须是强签名的;然后你希望重用的类必须是公开的.
接着用gacutil把这个C#程序安装到GAC;最后用regasm注册这个
程序集.

现在你就可以在VC里调用CoCreateInstance创建C#程序里的托管类实例了.
在COM它被公开为一个IDispatch.你也可以自己声明一个类接口直接转型过来用.
shaw0129 2009-09-17
  • 打赏
  • 举报
回复
谢谢 楼上的,就是说要在vc的那个程序里面开托管? 可是怎么调用呢?
I_NBFA 2009-09-15
  • 打赏
  • 举报
回复
使用/clr编译选项, 和#pragma managed/#pragma unmanaged
Enable function-level control for compiling functions as managed or unmanaged.


#pragma managed
#pragma unmanaged
#pragma managed([push,] on | off)
#pragma managed(pop)


Remarks
The /clr compiler option provides module-level control for compiling functions either as managed or unmanaged.

An unmanaged function will be compiled for the native platform, and execution of that portion of the program will be passed to the native platform by the common language runtime.

Functions are compiled as managed by default when /clr is used.

Use the following guidelines when applying these pragmas:

Add the pragma preceding a function but not within a function body.

Add the pragma after #include statements (do not use these pragmas before #include statements).

The compiler ignores the managed and unmanaged pragmas if /clr is not used in the compilation.

When a template function is instantiated, the pragma state at the time of definition for the template determines if it is managed or unmanaged.

For more information, see Initialization of Mixed Assemblies.

Example
Copy Code
// pragma_directives_managed_unmanaged.cpp
// compile with: /clr
#include <stdio.h>

// func1 is managed
void func1() {
System::Console::WriteLine("In managed function.");
}

// #pragma unmanaged
// push managed state on to stack and set unmanaged state
#pragma managed(push, off)

// func2 is unmanaged
void func2() {
printf("In unmanaged function.\n");
}

// #pragma managed
#pragma managed(pop)

// main is managed
int main() {
func1();
func2();
}

Copy Code
In managed function.
In unmanaged function.

我看了看反汇编, 托管的被编译成中间语言, 非托管的是传统汇编码.
很奇特的一种组合....还能被Reflector反汇编....真够好玩的.....
shaw0129 2009-09-15
  • 打赏
  • 举报
回复
谢谢 楼上几位的回复, vc的代码不是vc.net托管的,那个C#程序里面还涉及到很多界面,所以照着改就不太可能了,一些控件什么和mfc都不太一样的,因为vc里面可以做成dll给其他的调用,所以在想有没有类似的方法把那个C#改了给VC调用?
jackyjkchen 2009-09-14
  • 打赏
  • 举报
回复
C#调VC到可以,Vc的做成dll就行了;反过来困难
jackson35296 2009-09-14
  • 打赏
  • 举报
回复
C#是托管的,不能移植到vc里,否则大家都用C#写了,C#多容易啊
jyh_baoding 2009-09-14
  • 打赏
  • 举报
回复
有代码按规则移植一下就可以了
feilinhe 2009-09-14
  • 打赏
  • 举报
回复
要是vc.net托管的,代码可以拷过来,可以改改
要是MFC那就只能按照c#编的那些功能重写了
MoXiaoRab 2009-09-14
  • 打赏
  • 举报
回复
要看了。移植到VC.Net托管下很简单,非托管就得费心的改代码了

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧