Используя Reflection, выдается исключение безопасности - PullRequest
0 голосов
/ 11 ноября 2010

Итак, у меня есть следующий код:

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string dllPath);

В функции:

            SetDllDirectory(@"G:\Sean\Debug\");

            Assembly loadedDLL = Assembly.LoadFrom(@"G:\Sean\Debug\BonderControlPanelSim.dll", AppDomain.CurrentDomain.Evidence);
            Type rtsObj = loadedDLL.GetType("Oe.Te.Ranorex.Instrument.BonderControlPanelSim");
            Object obj = Activator.CreateInstance(rtsObj);

            rtsObj.InvokeMember("Initialize", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { "COM3", 1, 2 });
            rtsObj.InvokeMember("PushStart", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { 3 });
            rtsObj.InvokeMember("Shutdown", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, null);

Однако, когда я запускаю небольшое приложение с этой функцией из той же папки, что и библиотеки DLL, проблем не возникает. Когда я перемещаю исполняемый файл на другую машину, на которую подключен G-диск, я получаю исключение безопасности.

<IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Flags="UnmanagedCode"/>

Не уверен, как справиться с этим. В Ассамблею. Загрузи от меня доказательства.

Исключение выдается при первом rtsObj.InvokeMember.

Ценю вашу помощь!

РЕДАКТИРОВАТЬ: приложение фактически не запускается на других машинах. Если у меня на компьютере один исполняемый файл, он запустится.

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Вы можете изменить свою политику безопасности, чтобы разрешить CLR открываться из удаленного источника.

http://blogs.msdn.com/b/shawnfa/archive/2009/06/08/more-implicit-uses-of-cas-policy-loadfromremotesources.aspx

// From the Article
// Since this application only trusts a handful of LoadFrom operations,
// we'll put them all into the same AppDomain which is a simple sandbox
// with a full trust grant set.  The application itself will not enable
// loadFromRemoteSources, but instead channel all of the trusted loads
// into this domain.
PermissionSet trustedLoadFromRemoteSourceGrantSet
    = new PermissionSet(PermissionState.Unrestricted);

AppDomainSetup trustedLoadFromRemoteSourcesSetup = new AppDomainSetup();
trustedLoadFromRemoteSourcesSetup.ApplicationBase =
    AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

AppDomain trustedRemoteLoadDomain =
    AppDomain.CreateDomain("Trusted LoadFromRemoteSources Domain",
                           null,
                           trustedLoadFromRemoteSourcesSetup,
                           trustedLoadFromRemoteSourcesGrantSet);

// Now all trusted remote LoadFroms can be done in the trustedRemoteLoadDomain,
// and communicated with via a MarshalByRefObject.
1 голос
/ 11 ноября 2010

.NET-сборки, находящиеся на удаленных сетевых ресурсах, не считаются достаточно надежными в соответствии с политикой безопасности .NET по умолчанию, чтобы позволить им выполнять P / Invokes.Вам потребуется изменить политику безопасности, скопировать сборку в локальную папку (не подключенный сетевой диск) или полностью удалить вызов SetDllDirectory P / Invoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...