转载地址:http://blog.sina.com.cn/s/blog_6d3edc7e010136j3.html
http://www.cnblogs.com/ly4cn/archive/2006/04/12/373494.html
#include "stdafx.h"
#using "SmartDeviceDLL.dll"
using namespace SmartDeviceDLL;
int _tmain(int argc, _TCHAR* argv[])
{
printf("1111111111111/n");
SmartDeviceDLL::ICalculator ^pICalc=gcnew SmartDeviceDLL::Class1();
long lResult =0;
lResult=pICalc->Add(5,10);
wprintf(L"the result is %d/n",lResult);
printf("222222222222222222/n");
char c;
scanf("%c",&c);
return 0;
}
二、C#生成DLL端编译成COM接口,供VC++以托管格式调用(命令的运行都是在visual studio command prompt (命令窗口)中)
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
namespace SmartDeviceDLL
{
public interface ICalculator
{
int Add(int Number1, int Number2);
}
public class Class1: ICalculator
{
public int Add(int Number1, int Number2)
{
return Number1 * Number2;
}
public static int TestMethod(String s)
{
Console.WriteLine("Managed assembly: [0]", s);
return s.Length;
}
}
}
2.为程序集创建一个强命名的类库,并在AssemblyInfo.cs文件中用AssemblyKeyFile属性指向它:
#include "stdafx.h"
#import "SmartDeviceDLL.tlb" named_guids raw_interfaces_only
using namespace SmartDeviceDLL;
int _tmain(int argc, _TCHAR* argv[])
{
printf("1111111111111/n");
//初始化COM以及产生智能指针
HRESULT hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
if(hr!=S_OK)
printf("hr failed/n");
else
printf("hr ok/n");
printf("222222222222222222/n");
SmartDeviceDLL::ICalculatorPtr pICalc;
printf("2.1/n");
HRESULT hRes=pICalc.CreateInstance(__uuidof(Class1),NULL,CLSCTX_ALL);
//HRESULT hRes=pICalc.CreateInstance(SmartDeviceDLL::CLSID_Class1);
printf("2.2/n");
if(hRes==S_OK)
{
printf("hRes ok/n");
long lResult =0;
pICalc->Add(5,10, &lResult);
wprintf(L"the result is %d/n",lResult);
}
else
printf("hRes failure/n");
printf("333333333333/n");
CoUninitialize();
printf("4444444444444444444/n");
char c;
scanf("%c",&c);
return 0;
}
==============================================================================================
#include
#include
using namespace System;
namespace wrapper
{
public ref class ApiWrapper
{
public:
bool static MoveFile(String ^ lpExistingFileName, String ^ lpNewFileName )
{
pin_ptr src = PtrToStringChars(lpExistingFileName);
pin_ptr dst = PtrToStringChars(lpNewFileName);
return ::MoveFile(src, dst);
}
};
}
然后在C#中,引用上面代码生成的DLL文件,就可以直接调用了:
class UnmanagedClass
{
public:
LPCWSTR GetPropertyA() { return L"Hello!"; }
void MethodB( LPCWSTR ) {}
};
我们只要再增加一个包装类到工程文件中:
namespace wrapper
{
public ref class ManagedClass
{
public:
// Allocate the native object on the C++ Heap via a constructor
ManagedClass() : m_Impl( new UnmanagedClass ) {}
// Deallocate the native object on a destructor
~ManagedClass()
{
delete m_Impl;
}
protected:
// Deallocate the native object on the finalizer just in case no destructor is called
!ManagedClass()
{
delete m_Impl;
}
public:
property String ^ get_PropertyA
{
String ^ get()
{
return gcnew String( m_Impl->GetPropertyA());
}
}
void MethodB( String ^ theString )
{
pin_ptr str = PtrToStringChars(theString);
m_Impl->MethodB(str);
}
private:
UnmanagedClass * m_Impl;
};
}
然后,改变编译选项为“使用公共语言扩展 /clr”就可以了。这样,我们把代码编译成DLL文件就可以供.NET其它语言调用了。
#pragma unmanaged
#include
using namespace std;
template
void f(T t)
{
cout << t << endl;
}
#pragma managed
using namespace System;
void m(String ^ s){
Console::WriteLine(s);
}
void main()
{
f("Hello");
m("World");
}
场景五:不想要DLL,能不能直接把C++源代码与C#源代码一起编译成一个单独的Assembly呢?
当然是可以的。具体参见:让C++代码与C#代码一起生成一个单一的Assembly
让C++代码与C#代码一起生成一个单一的Assembly
本文提供了一个方法,让C++源码和C#源码一起编译链接成一个单一的Assembly。
由于M$的C++/CLI提供了IJW方法,允许将旧有C++代码也编译成托管代码,因此这篇小文可以用极小的工作量来彻底解决所有C++遗留代码移植到.NET的问题。
这个方法,再加上前次的小文《您也使用托管C++吗?》,就可以把C++遗留代码移植到.NET的所有方法一网打尽了。
好了,言归正传。
假设一个很简单的C++程序,它只有一个函数:
//c.h
#pragma once
int sqr(int n);
//c.cpp
#include "c.h"
int sqr(int n)
{
return n*n;
}
为了能让它与C#共同工作,必须为它加个.NET的包装:
//wrapper.cpp
#include "c.h"
namespace wrapper
{
public ref class calc
{
public:
static int sqr(int n)
{
return ::sqr(n);
}
};
}
现在可以用C#去调用它了:
//cs.cs
using System;
namespace test
{
public class Program
{
public static void Main()
{
Console.WriteLine(wrapper.calc.sqr(11));
}
}
}
部份例子来自MSDN.
msdn:http://support.microsoft.com/kb/828736/en-us
http://support.microsoft.com/kb/828736#top