我有一个C#DLL,可以通过RGiesecke.DllExport从中导出方法。

当我从C#控制台应用程序调用导出的方法时,一切正常
但是我在Inno-Setup中使用它,然后出现以下错误:



导出的方法使用另一个DLL中的另一个方法。
对我来说奇怪的是为什么我可以从另一个类而不是从另一个DLL调用方法。
在下面的示例中,我标记了无效的方法。

我的问题是,为什么会出现此错误?

第一个DLL

namespace ExposeTestLibrary
{
    public class TestClass
    {
        [DllExport("Test2", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static void Test2()
        {
            //works
            TestClass tc = new TestClass();
            tc.DoSomething2();

            //works
            SubLib2 sl2 = new SubLib2();
            sl2.DoSomething3();

            //Doesn't work
            SubLib sl = new SubLib();
            sl.DoSomething();
        }

        public void DoSomething2()
        {
            System.Windows.Forms.MessageBox.Show("DoSomething2");
        }
    }

    public class SubLib2
    {
        public SubLib2()
        {

        }

        public void DoSomething3()
        {
            System.Windows.Forms.MessageBox.Show("DoSomething3");
        }
    }
}


第二个DLL

namespace ExposeSubLibrary
{
    public class SubLib
    {
        public SubLib()
        {

        }

        public void DoSomething()
        {
            System.Windows.Forms.MessageBox.Show("DoSomething");
        }
    }
}


这是我从Inno-Setup调用的方式

[Code]
    procedure Test2();
    external 'Test2@{src}\ExposeTestLibrary.dll stdcall loadwithalteredsearchpath';

function InitializeSetup:boolean;
begin
    MsgBox('WAIT', mbInformation, MB_OK);
    Test2();
    result:=true;
end;

最佳答案

汉斯是对的,您必须考虑如何报告或记录错误。

但是,在您的情况下,我想问题是CLR无法找到其他程序集。
程序集不是相对于正在使用它们的程序集而是相对于当前应用程序域的探测路径来解析。
在您的情况下,appdomain将是默认域,而您的探测路径将是可执行文件的目录。

您可以在TestClass的静态ctor中为AssemblyResolve设置处理程序。或者只是assembly.load使用它的完整文件名一次(也在静态ctor中)。

10-07 19:09
查看更多