vc9.0 写的
// This is the main DLL file.#include "stdafx.h"#include "cdll.h"
int cdll::Perl::Run(char cmd)
{
system( "cmd" ); 
return 1;
}
// cdll.h#pragma once
#include <process.h> 
using namespace System;namespace cdll { public ref class Perl
{
int Run(char cmd);

};
}
在c#中调用        [DllImport(@"cdll.dll", EntryPoint = "Perl::Run", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public extern static int Run(string cmd); 
出现问题,找不到Perl::Run。如何解决

解决方案 »

  1.   


    C#中的extern修饰符 extern
    修饰符用于声明在程序集外部实现的成员函数。extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 属性一起使用。在这种情况下,还必须将方法声明为 static。
    经常用于系统API函数的调用(通过 DllImport,例如可以通过它调用一个底层用C或C++写的函数)。注意,和DllImport一起使用时要加上 static 修饰符 
    也可以用于对于同一程序集不同版本组件的调(用 extern 声明别名)
    不能与 abstract 修饰符同时使用 示例: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; 
    namespace Example03 {     class Program     {         //注意DllImport是一个Attribute Property,在System.Runtime.InteropServices命名空间中定义         //extern与DllImport一起使用时必须再加上一个static修饰符         [DllImport("User32.dll")]         public static extern int MessageBox(int Handle, string Message, string Caption, int Type); 
            static int Main()         {             return MessageBox(0, "Are you sure?","My Message Box", 0);         }     } } 这段代码调用了User.dll中的MessageBox函数,运行结果是显示一个messageBox。
    直接引用dll不行吗?我这样用过,如上。