2012-05-01 126 views
0

我试图做一个基本的C++ DLL,以便在C#中使用它..下面的类用于:C++ DLL导入到C#应用程序

我的cpp文件

#include "stdafx.h"  
#include "MathFuncsAssembly.h" 

namespace MathFuncs 
{ 
    double MyMathFuncs::Add(double a, double b) 
    { 
     return a + b; 
    } 

    double MyMathFuncs::Subtract(double a, double b) 
    { 
     return a - b; 
    } 

    double MyMathFuncs::Multiply(double a, double b) 
    { 
     return a * b; 
    } 

    double MyMathFuncs::Divide(double a, double b) 
    { 
     if (b == 0) 
     { 
      throw gcnew DivideByZeroException("b cannot be zero!"); 
     } 

     return a/b; 
    } 
} 

我的头文件

using namespace System; 

namespace MathFuncs 
{ 
    public ref class MyMathFuncs 
    { 
    public: 
     static double Add(double a, double b); 

     static double Subtract(double a, double b); 

     static double Multiply(double a, double b); 

     static double Divide(double a, double b); 
    }; 
} 

,并在我的C#应用​​程序,其中我调用库

[DllImport("MathFuncsAssembly.dll")] 
public static extern double Add(double a, double b); 

static void Main(string[] args) 
{ 
    Console.WriteLine(Add(10.0, 11.0)); 
    Console.ReadLine(); 
} 

(Add(10.0,11.0))部件发生异常。抛出以下异常: 尝试装入格式不正确的程序。 (从HRESULT异常:0x8007000B)..任何想法?另外,我复制了C#应用程序的bin文件中的.dll文件...

谢谢!

+0

是DLL文件32还是64位?你的clr是32位还是64位?通常这是与您的错误相关的这种不兼容性。 – alegen

+2

你是这样做的错误方式..如果你有一个ref类(因此也是一个C++/CLI DLL),你根本不需要DllImport:只需在C#项目中添加一个对dll的引用,然后调用函数'的C#方式'即MathFuncs.Add() – stijn

+0

@stijin ...感谢很多队友!:)))多数民众赞成在正确的答案:)) – user1317277

回答

1

如果你有一个ref类(因此是一个C++/CLI dll),你根本不需要DllImport:只需在C#项目中添加一个对dll的引用,并调用函数的'C#方式'即MathFuncs.Add()(注意你仍然需要确保平台匹配,CLI dll依赖的所有本地dll都在路径中)

+0

@ stijin ..我的应用程序由结构..我应该在哪里定义结构?在标题或.cpp?此外,一些方法返回一个指向结构的实例的指针..我该怎么做?因为我不断得到相同的错误..错误是以下内容:'错误错误C2027:使用未定义的类型' – user1317277

+0

通常你会声明该结构与它的头函数,并提供定义在源(cpp)。 C2027意味着你正在使用编译器不知道的类型。最好为这个和后面的代码启动一个单独的问题,否则就不可能回答这个问题。 – stijn

0

通常情况下,当您尝试在x64程序中使用x32 DLL或反之时,会发生这种情况。

0

“不正确格式”异常意味着您正在加载为不同平台编译的模块,即32位和64位。确保你的DLL和你的C#应用​​程序是为同一个平台编译的。如果C#设置为“任何平台”,请明确选择您的DLL用于的平台。