C#P / Invoke嵌入式VB6 DLL资源:ActiveXObject“无法在DLL'DLLName'中找到名为'FunctionName'的入口点。”

时间:2012-04-26 23:07:58

标签: c# dll vb6 wrapper activexobject

我正在尝试为VB6 DLL创建一个C#包装器DLL,然后在网页中使用该包装器作为ActiveXObject,但是在调用ClassTesting()时我收到此错误:

  

无法在DLL'VB6DLL'中找到名为“ClassTest”的入口点。

应用程序将DLL导出到临时目录,然后将其加载到内存中。 DLL的结构可以描述为:

VB6DLL.dll - >公共类“VB6.cls” - >公共职能“ClassTest()”。

C#代码如下:

namespace SystemDeviceDriver
{
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IDeviceDriver
    {
        [DispId(1)]
        string ClassTesting();
    }

    [Guid("655EE123-0996-4c70-B6BD-7CA8849799C7")]
    [ComSourceInterfaces(typeof(IDeviceDriver))]
    public class DeviceDriver : IDeviceDriver
    {

        [DllImport("kernel32", CharSet = CharSet.Unicode)]
        static extern IntPtr LoadLibrary(string lpFileName);

        [DllImport("VB6DLL", CharSet = CharSet.Unicode)]
        static extern string ClassTest();

        public DeviceDriver()
        {
            //Write the VB6DLL to a temp directory
            string dirName = Path.Combine(Path.GetTempPath(), "SystemDeviceDriver." + Assembly.GetExecutingAssembly().GetName().Version.ToString());
            if (!Directory.Exists(dirName))
            {
                Directory.CreateDirectory(dirName);
            }
            string dllPath = Path.Combine(dirName, "VB6DLL.dll");
            File.WriteAllBytes(dllPath, SystemDeviceDriver.Properties.Resources.VB6DLL);

            //Load the library into memory
            IntPtr h = LoadLibrary(dllPath);
            Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
        }

        public string ClassTesting()
        {
            return ClassTest();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

DllImport / P / Invoke函数用于包含“旧C样式”dll文件,因此从库中导出的简单函数

这里列出了调用方法,可以使用哪些函数类型: http://msdn.microsoft.com/de-de/library/system.runtime.interopservices.callingconvention.aspx

COM完全不同,请参阅:http://en.wikipedia.org/wiki/Component_Object_Model

COM dll通常导出的唯一函数是DllRegisterServer,DllUnregisterServer 您可以先使用P / Invoke函数来调用该函数。 COM dll文件在注册表中注册。那么应该可以创建一个COM对象。