0

VB6 DLL用のC#ラッパーDLLを作成し、そのラッパーをWebページで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();
        }
    }
}
4

1 に答える 1

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関数を使用してその関数を呼び出すことができます。COMdllファイルはそれ自体をレジストリに登録します。そうすれば、COMオブジェクトを作成できるはずです。

于 2012-04-26T23:54:43.533 に答える